2016-06-22 7 views
1

Hallo, ich versuche, den Datensatz (HttpDelete) zu löschen. Die Methode in der Steuerung löst nicht aus und 405 Method Not Allowed error error.WEB API2/HTTP DELETE löst nicht aus - 405 Fehler

jquery unten

function deleteContract(contractId) { 
      var contract = new Object(); 
      contract.ContractID = "ContractId"; 
      $.ajax({ 
       async: true, 
       type: 'DELETE', 
       data: contract, 
       dataType: "json", 
       url: 'http://localhost:4233/api/Contract/DeleteContractById/' + contractId, 
      }).done(function (data, textStatus, xhr) { 
       alert("deleted successfully") 
      }).error(function (jqXHR, textStatus, errorThrown) { 
       alert(jqXHR.responseText || textStatus); 
      }) 
     } 

Controller unten

// DELETE: api/Contract/5 
    [ResponseType(typeof(Contract))] 
    [AllowAnonymous] 
    [HttpDelete] 
    [ActionName("DeleteContractById")] 
    //[Route("api/Contract/{id}")] 
    [AcceptVerbs("DELETE")] 
    public HttpResponseMessage DeleteContract(Guid id) 
    { 
     Contract contract = db.Contract.Find(id); 
     if (contract == null) 
     { 
      return Request.CreateResponse(HttpStatusCode.NotFound); 
     } 

     db.Strata.Remove(contract); 
     db.SaveChanges(); 
     return Request.CreateResponse(HttpStatusCode.OK, contract); 
    } 

webapiconfig unten

public static void Register(HttpConfiguration config) 
    { 
       config.SuppressDefaultHostAuthentication(); 
     config.Filters.Add(new HostAuthenticationFilter(OAuthDefaults.AuthenticationType)); 

       config.MapHttpAttributeRoutes(); 

      config.Routes.MapHttpRoute(
      name: "ControllerAndAction", 
      routeTemplate: "api/{controller}/{action}/{id}", 
      defaults: new { action = "GET", id = RouteParameter.Optional } 
     ); 

    } 

Web Config unten

<system.webServer> 
    <validation validateIntegratedModeConfiguration="false"/> 
    <modules runAllManagedModulesForAllRequests="true"> 
     <remove name="WebDAVModule"/> 
    </modules> 

    <handlers> 
    <remove name="WebDAV" /> 
     <remove name="ExtensionlessUrlHandler-Integrated-4.0" /> 
     <remove name="OPTIONSVerbHandler" /> 
     <remove name="TRACEVerbHandler" /> 
     <add name="ExtensionlessUrlHandler-Integrated-4.0" path="*." verb="*" type="System.Web.Handlers.TransferRequestHandler" preCondition="integratedMode,runtimeVersionv4.0" /> 
    </handlers> 
    <httpProtocol> 
    <customHeaders> 
    <add name="Access-Control-Allow-Origin" value="*" /> 
    <add name="Access-Control-Allow-Methods" value="GET, POST, OPTIONS, PUT, DELETE" /> 
    </customHeaders> 
</httpProtocol> 
    </system.webServer> 

Wenn ich den Anruf mit Fiddler mache funktioniert es gut. Lass es mich wissen, wenn ich irgendwelche Einstellungen im Code verpasst habe.

Dank Dev

+1

Mögliche Duplikate von [ASP.NET-Web-API - VERBINDEN UND LÖSCHEN Verben nicht zulässig - IIS 8] (http://stackoverflow.com/questions/10906411/asp-net-web-api-put-delete-verbs- not-allowed-iis-8) – Luke

+0

Bitte werfen Sie einen Blick auf diese bestehenden Fragen: http://stackoverflow.com/questions/10906411/asp-net-web-api-put-delete-verbs-not-allowed-iis- 8 http: // Stapelüberlauf.com/questions/15619075/webapi-delete-not-working-405-Methode-nicht-erlaubt http://stackoverflow.com/questions/10906411/asp-net-web-api-put-delete-verbs-not-allowed -iis-8 – Luke

+0

Ich hatte dieses Problem bereits zuvor und ich _disabled_ WebDav für den Anwendungspool, auf dem meine Website gehostet wurde. – Luke

Antwort

0

Haben Sie Asynchron-Syntax zu verwenden versucht? Wie

public async Task<HttpResponseMessage> DeleteStrata(Guid id) 
... 
await db.SaveChangesAsync() 
+1

Willkommen bei Stack Overflow! Bitte fügen Sie eine Erklärung hinzu, warum dieser Code dem OP hilft. Dies wird helfen, eine Antwort zu liefern, von der zukünftige Zuschauer lernen können. Weitere Informationen finden Sie unter [Antwort]. –

+1

Der Fehler ist eine 405 Methode nicht zulässig. Der Server lehnt die Verbindung aktiv ab. Wenn Sie es leider in Async ändern, wird dieses Problem nicht gelöst, damit der Server die HTTP-Anforderung mit dem HTTP-Verb DELETE akzeptieren kann. – Luke

+0

Entschuldigung für eine späte Antwort. Denke, mein Vorschlag war nicht gut durchdacht. Jetzt denke ich nicht, dass es helfen würde. Das Problem liegt woanders und ich weiß nicht wo. Es tut uns leid. –

0

Ich habe 405 bekommen, wenn die Methode, die ich verwendete, nicht war, was die API erwartet hatte. Und ich habe ein paar Dinge bemerken, obwohl ich nicht sicher bin, das sind die zugrunde liegenden Probleme:

  1. Der Aktionsname auf der API falsch geschrieben ist, sollte es DeleteContractById sein (es Vertrag anstelle von Vertrag hat).
  2. Die deleteContract-Funktion übergibt einen Körper. Die API-Methode erwartet keinen Body (Daten).
  3. Die Route ist so eingerichtet, dass eine GUID-ID erwartet wird. Wird der Wert von ContractId in deleteContract übergeben, wird eine gültige GUID zurückgegeben?
+0

Ich habe den Rechtschreibfehler "deletecontractbyid" korrigiert. im Quellcode ist es korrekt. –

0

Wir haben die Lösung von unten tun

ändert

web.config

<customHeaders> 
    <add name="Access-Control-Allow-Methods" value="GET, POST, PUT, DELETE, OPTIONS" /> 
    <add name="Access-Control-Request-Headers" value="*" /> 
    <add name="Access-Control-Allow-Headers" value="*" /> 
</customHeaders> 

Startup.Auth.cs

erklären die unten in Klassenstufe

gefunden
[EnableCors(origins: "http://localhost:49369", headers: "*", methods: "*", exposedHeaders: "X-Custom-Header")] 
public void ConfigureAuth(IAppBuilder app) 
{ 
    app.UseCors(CorsOptions.AllowAll); // newly added this require to "Install-Package Microsoft.Owin.Cors" 
} 

-Controller

[EnableCors(origins: "http://localhost:49369", headers: "*", methods: "*", exposedHeaders: "X-Custom-Header")] 
public class ContractController : ApiController 
{ 
} 

WebApi.config

public static class WebApiConfig 
{ 

    public static void Register(HttpConfiguration config) 
    { 
     // Web API configuration and services 
     // Configure Web API to use only bearer token authentication. 

     config.SuppressDefaultHostAuthentication(); 
     config.Filters.Add(new HostAuthenticationFilter(OAuthDefaults.AuthenticationType)); 

     // Web API routes 
     config.MapHttpAttributeRoutes(); 

     // Controllers with Actions 
     // To handle routes like `/api/VTRouting/route` 
     config.Routes.MapHttpRoute(
      name: "ControllerAndAction", 
      routeTemplate: "api/{controller}/{action}/{id}", 
      defaults: new { action = "GET", id = RouteParameter.Optional } 
     ); 

    } 
} 

Das ist alles, es ist zu arbeiten begann.

+0

Ich akzeptiere, dass Sie GET, POST, PUT, DELETE, OPTIONS Anfragen von anderen Domains akzeptieren, wenn Sie CORS aktivieren? Wenn du es nicht bist, dann glaube ich nicht, dass du es aktivieren solltest. – Luke