Ứ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?
url: "api/Signouts/54" có hoạt động không? Tôi không chắc chắn mặc dù –
Thật không may, điều đó mang lại cho tôi kết quả tương tự. – Scott
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? –