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?
Ist url: „api/Signouts/54“ funktioniert? Ich bin mir nicht sicher, aber –
Leider gibt mir das das gleiche Ergebnis. – Scott
Können Sie versuchen, die [HttpDelete] - und [HttpPut] -Anmerkungen für die spezifischen Funktionen in Ihrem Controller zu verwenden? –