我试图在Web API控制器上实现一个Delete方法.但是,我总是得到404 – 找不到.在这一点上,我有GET,POST和PUT方法工作正常.我一直在阅读一些关于同样问题的其他SO帖子 – 没有一个是正常的.
控制器动作
public virtual HttpResponseMessage Delete(string customerId) { adapter.RemoveCustomer(customerId); return Request.CreateResponse(HttpStatusCode.OK,"The customer was deleted."); }
AJAX请求
function remove(customer,success,error) { var url = '/api/Customer'; var data = JSON.stringify({ 'customerId': customer.CustomerId }); $.ajax({ url: url,type: 'DELETE',data: data,contentType: 'application/json' }) .done(function (data,textStatus,handler) { success(data); }) .fail(function (handler,errorThrown) { error(errorThrown); }); };
Web.Config
这是我的web.config文件.除了模块部分,一切都与创建项目时相同:
<system.webServer> <validation validateIntegratedModeConfiguration="false" /> <!--<modules runAllManagedModulesForAllRequests="true"></modules>--> <modules> <remove name="UrlRoutingModule-4.0" /> <add name="UrlRoutingModule-4.0" type="System.Web.Routing.UrlRoutingModule" preCondition="" /> </modules> <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,OPTIONS" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework64\v4.0.30319\aspnet_isapi.dll" preCondition="classicMode,bitness64" responseBufferLimit="0" /> <add name="ExtensionlessUrlHandler-Integrated-4.0" path="*." verb="GET,OPTIONS" type="System.Web.Handlers.TransferRequestHandler" preCondition="integratedMode,runtimeVersionv4.0" /> </handlers> </system.webServer>
我正在使用IIS Express,但如果我切换回Visual Studio Development Server,仍然会出现此问题.
原始HTTP
以下是Fiddler捕获的原始HTTP请求:
DELETE http://localhost:63654/TestMvcApplication/api/Customer HTTP/1.1 Host: localhost:63654 Connection: keep-alive Content-Length: 49 Accept: application/json,text/javascript,*/*; q=0.01 Origin: http://localhost:63654 X-Requested-With: XMLHttpRequest User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML,like Gecko) Chrome/27.0.1453.116 Safari/537.36 Content-Type: application/json Referer: http://localhost:63654/TestMvcApplication/ Accept-Encoding: gzip,deflate,sdch Accept-Language: en-US,en;q=0.8 {"customerId":"e107e2dc20834545ae209849bff195f0"}
这里是回应:
HTTP/1.1 404 Not Found Cache-Control: no-cache Pragma: no-cache Content-Type: application/json; charset=utf-8 Expires: -1 Server: Microsoft-IIS/8.0 X-AspNet-Version: 4.0.30319 X-SourceFiles: =?UTF-8?B?QzpcVXNlcnNcdHBhcmtzXERvY3VtZW50c1xHaXRIdWJcVGVzdE12Y0FwcGxpY2F0aW9uXFRlc3RNdmNBcHBsaWNhdGlvblxhcGlcQ3VzdG9tZXI=?= X-Powered-By: ASP.NET Date: Tue,02 Jul 2013 13:11:52 GMT Content-Length: 220 {"Message":"No HTTP resource was found that matches the request URI 'http://localhost:63654/TestMvcApplication/api/Customer'.","MessageDetail":"No action was found on the controller 'Customer' that matches the request."}
这是一个开源的project,用于教我自己.我已经检查了最新的情况,如果有人想看到完整的来源.
解决方法
public virtual HttpResponseMessage Delete(string customerId)
参数是一个简单的类型,并且来自URI,而不是来自请求体.或者将查询字符串中的客户ID传递给http:// localhost:63654 / TestMvcApplication / api / Customer?customerId = 123或将签名更改为公共虚拟HttpResponseMessage Delete(string id)并使用URI http:// localhost :63654 / TestMvcApplication / API /客户/ 123.