10

我有一个VS2012 MVC4解决方案,我测试Web API控制器。Asp.Net MVC4 + Web API控制器删除请求>> 404错误

我成功地测试了GET,POST,PUT,但DELETE仍然给我一个http 404错误。当我在我的api控制器的'DeleteMovie'动作中设置断点时,断点永远不会到达。

我读了很多关于这个问题的帖子,但没有人帮助我。

这里是我的DELETE API控制器:

[HttpDelete] 
    public HttpResponseMessage DeleteMovie(int id) 
    {  
     // Delete the movie from the database  
     // Return status code  
     return new HttpResponseMessage(HttpStatusCode.NoContent); 

    } 

这里是我的html页面:

<script type="text/javascript"> 

    deleteMovie(1, function() 
    { 
     alert("Movie deleted!"); 
    }); 

    function deleteMovie(id, callback) { 
     $.ajax({ 
      url: "/api/Movie", 
      data: JSON.stringify({ id: id }), 
      type: "DELETE", 
      contentType: "application/json;charset=utf-8", 
      statusCode: { 
       204: function() { 
        callback(); 
       } 
      } 
     }); 
    } 

</script> 

我的经典路线如下:

public static void RegisterRoutes(RouteCollection routes) 
    { 
     routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); 

     routes.MapRoute(
      name: "Default", 
      url: "{controller}/{action}/{id}", 
      defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional } 
     ); 
    } 

我的路由API如下:

public static void Register(HttpConfiguration config) 
    { 
     config.Routes.MapHttpRoute(
      name: "ActionApi", 
      routeTemplate: "api/{controller}/{action}/{id}", 
      defaults: new { id = RouteParameter.Optional } 
     ); 

     config.Routes.MapHttpRoute(
      name: "DefaultApi", 
      routeTemplate: "api/{controller}/{id}", 
      defaults: new { id = RouteParameter.Optional } 
     ); 
    } 

在我的解决方案的特性,我配置“使用本地IIS Web服务器”与“使用IIS Express的检查

我也试图与“使用Visual Studio开发服务器”,但同样的问题。

有什么想法?

谢谢。

+0

在浏览器中,如果你使用的调试工具,可以拍摄到实际时发出的URL由jQuery,看看它看起来是否理智? – 2013-02-28 12:08:10

回答

16

HTTP DELETE没有正文。您需要将该ID作为查询字符串参数传递。

+1

谢谢。你是对的!我在这里发现了一篇博客文章中的代码:http://stephenwalther.com/archive/2012/03/05/introduction-to-the-asp-net-web-api.aspx所以我真的没有想到这样的问题! – Bronzato 2013-02-28 12:40:10

33

如果您收到的错误是从IIS中的HTML内容类型,错误404.0

请确保您有一个由网络API模板添加在你的web.config部分。 默认情况下,IIS不会提供DELETE谓词,并且此配置将覆盖该行为。

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

+1我从一个MVC项目开始,但只是想将其用于WebAPI。所以删除我认为是MVC特定的配置后,我的DELETE请求是404。谢谢。 – 2013-05-30 07:31:46

0

据罗素回答我参加了web配置一看,发现在处理方法两行

.... 
<add name="ExtensionlessUrlHandler-Integrated-4.0" path="*." verb="*" type="System.Web.Handlers.TransferRequestHandler" preCondition="integratedMode,runtimeVersionv4.0" /> 
<remove name="ExtensionlessUrlHandler-Integrated-4.0" /> 

我已经去除了最后一个和它的工作。

只是一个客户端使用的例子(打字稿)

public deleteComment(commentId: number) { 
     var url = 'api/comments/' + commentId; 
     return this.$http.delete(url); 
    } 

和服务器端

[Route("{id:int}")] 
    public async Task<IHttpActionResult> Delete(int id){ 
     await _snippetService.DeleteComment(id); 
     return Ok(); 
    }