2015-02-17 26 views
7

Ứng dụng MVC ASP.NET của tôi trả về lỗi 404 khi tôi yêu cầu PUT hoặc DELETE. Nó được sử dụng để trở về một 405, nhưng tôi đã giải quyết bằng cách kích hoạt CORS. Tôi đã thử tất cả các loại giải pháp khác nhau (vô hiệu hóa WebDAV, thay đổi tuyến đường, đặt chuỗi truy vấn theo yêu cầu), nhưng dường như không có cách nào làm việc cho tôi. Tôi hy vọng tôi chỉ bỏ lỡ một cái gì đó vô cùng đơn giản. Đây là mã đơn giản có liên quan từ mỗi tập tin có liên quan trong ứng dụng của tôi:Web API + Yêu cầu jQuery AJAX DELETE trả lại 404

jQuery AJAX yêu cầu:

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

SignoutController (phương thức GET và POST làm việc từ đây chỉ tốt):

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

tuyến 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 (thấy ở một nơi khác trên SO)

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

Fiddler DELETE yêu cầu (giản thể 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 

Fiddler phản ứng:

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 

Đó là chỉ là một loạt các "giải pháp" khác nhau mà tôi đã gặp phải Tôi đã làm việc cho những người liên quan. Tôi làm sai ở đâu?

+0

url: "api/Signouts/54" có hoạt động không? Tôi không chắc chắn mặc dù –

+0

Thật không may, điều đó mang lại cho tôi kết quả tương tự. – Scott

+1

Bạn có thể thử sử dụng chú thích [HttpDelete] và [HttpPut] trên các chức năng cụ thể trong bộ điều khiển của mình không? –

Trả lời

7

Theo mặc định IIS không phục vụ DELETE yêu cầu: các system.webServer xử lý theo quy định tại Web.Config có thể thiết lập như thế nào để xử lý yêu cầu khi Application Pool trang web của bạn có một "chế độ đường ống được quản lý" của Integrated (IIS7) hoặc cổ điển (ISAPI 32 & 64 bit hương vị). Trong ví dụ của bạn, chỉ có ISAPI 64 bit được điều khiển. Phần sau đây cho thấy các biến thể khác.

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

tham khảo:

3

Richaux là đúng, IIS không phục vụ DELETE, PUT và các yêu cầu khác theo mặc định. Tuy nhiên, phần Web.config trong câu trả lời đó cho thấy cách nó được thực hiện trong mẫu MVC4. Khi tạo dự án API Web MVC5 từ mẫu MVC5, bạn sẽ thấy phần liên quan đăng ký trình xử lý cho tất cả các động từ:

<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> 
Các vấn đề liên quan