2015-02-17 5 views
7

Meine ASP.NET WebAPI & MVC-Anwendung gibt einen 404-Fehler, wenn ich eine PUT oder DELETE anfordern. Früher gab es eine 405 zurück, aber das habe ich durch Aktivieren von CORS gelöst. Ich habe alle möglichen verschiedenen Lösungen ausprobiert (WebDAV deaktivieren, Routen ändern, Querystring in Anfrage stellen), aber keine scheint für mich zu funktionieren. Ich hoffe, ich habe etwas sehr Einfaches verpasst. Hier ist relevant vereinfachten Code aus jeder entsprechenden Datei in meiner Anwendung:Web API + jQuery AJAX DELETE Anfrage zurückgeben 404

jQuery AJAX Anfrage:

$.ajax({ 
    url: "api/Signout?id=3", 
    type: "DELETE", 
    crossDomain: true, 
}); 

SignoutController (GET und POST-Methoden arbeiten hier ganz gut):

public void Delete([FromUri] int id) 
{ 
    //Do things 
} 

WebApiConfig Routen:

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

//For another part of the application 
config.Routes.MapHttpRoute(
    name: "SaveSignout", 
    routeTemplate: "api/{controller}/{signout}" 
); 

Web.config:

<system.webServer> 
    <httpProtocol> 
    <customHeaders> 
     <clear /> 
     <add name="Access-Control-Allow-Origin" value="*" /> 
     <add name="Access-Control-Allow-Headers" value="Origin, X-Requested-With, Content-Type, Accept" /> 
     <add name="Access-Control-Allow-Methods" value="GET, POST, PUT, DELETE, OPTIONS" /> 
    </customHeaders> 
    </httpProtocol> 
    <modules> 
    <remove name="FormsAuthenticationModule" /> 
    <remove name="WebDAVModule"/> 
    </modules> 
    <handlers> 
    <remove name="WebDAV" /> 
    <remove name="ExtensionlessUrlHandler-ISAPI-4.0_64bit" /> 
    <add name="ExtensionlessUrlHandler-ISAPI-4.0_64bit" 
     path="*." 
     verb="GET,HEAD,POST,DEBUG,PUT,DELETE,PATCH,OPTIONS" 
     modules="IsapiModule" 
     scriptProcessor="%windir%\Microsoft.NET\Framework64\v4.0.30319\aspnet_isapi.dll" 
     preCondition="classicMode,runtimeVersionv4.0,bitness64" 
     responseBufferLimit="0" /> 
    </handlers> 
</system.webServer> 

RouteConfig.cs (sah diese irgendwo anders auf SO)

routes.IgnoreRoute("{*x}", new { x = @".*\.asmx(/.*)?" }); 

Fiddler Anfrage DELETE (vereinfacht referer):

DELETE /api/Signout?id=45 HTTP/1.1 
Host: localhost:51301 
Connection: keep-alive 
Cache-Control: no-cache 
Authorization: Negotiate (large base64 here) 
Pragma: no-cache 
Accept: */* 
Origin: http://localhost:51301 
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/33.0.1750.154 Safari/537.36 
Referer: http://localhost:51301/Home/Controller/Id 
Accept-Encoding: gzip,deflate,sdch 
Accept-Language: en-US,en;q=0.8 

Antwort Fiedler:

HTTP/1.1 404 Not Found 
Cache-Control: private 
Content-Type: text/html; charset=utf-8 
Server: Microsoft-IIS/8.0 
X-SourceFiles: =?UTF-8?B? (base64 of full local path to api/Signout) 
Persistent-Auth: true 
Access-Control-Allow-Origin: * 
Access-Control-Allow-Headers: Origin, X-Requested-With, Content-Type, Accept 
Access-Control-Allow-Methods: GET, POST, PUT, DELETE, OPTIONS 
WWW-Authenticate: Negotiate oRswGaADCgEAoxIEEAEAAABDh+CIwTbjqQAAAAA= 
Date: Tue, 17 Feb 2015 18:05:18 GMT 
Content-Length: 4966 

Es ist nur eine ganze Reihe verschiedener "Lösungen", die ich gefunden habe Ich habe anscheinend für die Beteiligten gearbeitet. Wo gehe ich falsch?

+0

Ist url: „api/Signouts/54“ funktioniert? Ich bin mir nicht sicher, aber –

+0

Leider gibt mir das das gleiche Ergebnis. – Scott

+1

Können Sie versuchen, die [HttpDelete] - und [HttpPut] -Anmerkungen für die spezifischen Funktionen in Ihrem Controller zu verwenden? –

Antwort

7

standardmäßig IIS dient nicht Anfragen löschen: system.webServer in Web.Config definierten Handler können festlegen, wie die Verarbeitung von Anforderungen, wenn Application Becken Ihrer Webseite einen „Managed Pipeline-Modus“ von Integrated (IIS7) oder Classic (ISAPI 32 & 64 Bit hat Aromen). In Ihrem Beispiel wird nur ISAPI 64 Bit gesteuert. Das Folgende zeigt die anderen Variationen.

<system.webServer> 
    <handlers> 
     <remove name="ExtensionlessUrlHandler-ISAPI-4.0_32bit" /> 
     <remove name="ExtensionlessUrlHandler-ISAPI-4.0_64bit" /> 
     <remove name="ExtensionlessUrlHandler-Integrated-4.0" /> 
     <add name="ExtensionlessUrlHandler-ISAPI-4.0_32bit" path="*." verb="GET,HEAD,POST,DEBUG,PUT,DELETE,PATCH,OPTIONS" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework\v4.0.30319\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv4.0,bitness32" responseBufferLimit="0" /> 
     <add name="ExtensionlessUrlHandler-ISAPI-4.0_64bit" path="*." verb="GET,HEAD,POST,DEBUG,PUT,DELETE,PATCH,OPTIONS" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework64\v4.0.30319\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv4.0,bitness64" responseBufferLimit="0" /> 
     <add name="ExtensionlessUrlHandler-Integrated-4.0" path="*." verb="GET,HEAD,POST,DEBUG,PUT,DELETE,PATCH,OPTIONS" type="System.Web.Handlers.TransferRequestHandler" preCondition="integratedMode,runtimeVersionv4.0" /> 
    </handlers> 
    </system.webServer> 

Referenz:

3

Richaux korrekt ist, IIS dient nicht DELETE, PUT und andere Anfragen standardmäßig. Der Web.config Teil in dieser Antwort zeigt jedoch, wie es in der Vorlage MVC4 getan wurde. Wenn ein MVC5 Web API-Projekt von der MVC5 Vorlage erstellt werden Sie den entsprechenden Teil sehen, dass die Prozedur für alle Verben registriert:

<system.webServer> 
    <handlers> 
     <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> 
</system.webServer>