2015-02-17 16 views
7

My ASP.NET WebAPI & L'applicazione MVC restituisce un errore 404 quando si richiede PUT o DELETE. Restituiva un 405, ma ho risolto ciò abilitando CORS. Ho provato tutti i tipi di soluzioni diverse (disabilitando WebDAV, cambio percorsi, metti querystring in richiesta), ma nessuno sembra aver funzionato per me. Spero di essermi perso qualcosa di estremamente semplice. Ecco il codice semplificato pertinente di ogni file corrispondente nella mia applicazione:API Web + jQuery AJAX DELETE richiesta restituita 404

jQuery AJAX richiesta:

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

SignoutController (metodi GET e POST lavorano da qui bene):

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

percorsi WebApiConfig:

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 (visto questo da qualche altra parte su SO)

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

Fiddler DELETE richiesta (referer semplificato):

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 

Fiddler risposta:

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 

E ' solo una sfilza di varie "soluzioni" che ho incontrato in questo Ho lavorato apparentemente per le persone coinvolte. Dove sto andando male?

+0

Is url: "api/Signouts/54" funziona? Non sono sicuro che sia –

+0

Purtroppo, questo mi dà lo stesso risultato. – Scott

+1

Puoi provare a utilizzare le annotazioni [HttpDelete] e [HttpPut] sulle funzioni specifiche del controller? –

risposta

7

Per impostazione predefinita IIS non serve DELETE richieste: i system.webServer gestori definiti Web.Config possibile impostare il modo di elaborare le richieste, quando del tuo sito web Application Pool ha una "modalità pipeline gestite" di Integrated (IIS7) o Classic (ISAPI 32 & 64 bit aromi). Nel tuo esempio, solo ISAPI 64 bit è controllato. Quanto segue mostra le altre varianti.

<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> 

Riferimento:

3

Richaux è corretta, IIS non serve DELETE, PUT e altre richieste per impostazione predefinita. Tuttavia, la parte Web.config in quella risposta mostra come è stata eseguita nel modello MVC4. Quando si crea un progetto di API Web MVC5 dal modello MVC5 vedrete la parte rilevante che registra il gestore per tutti i verbi:

<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>