2013-10-31 90 views
0

我有一个ASP.NET MVC应用程序。 我有单一的函数模式,这将被称为与HTTP POST和HTTP DELETE。ASP.NET MVC HTTP Post/Delete

虽然调用Post,但绝不会调用Delete。我确认IIS接受HTTP删除。任何意见?

路线和控制器:

routes.MapHttpRoute(
      name: "RegisterCard", 
      routeTemplate: "{version}/cards/{cardID}", 
      defaults: new { Controller = "MyController", Action = " 

      routes.MapHttpRoute(
      name: "UnregisterCard", 
      routeTemplate: "{version}/cards/{cardID}", 
      defaults: new { Controller = "MyController", Action = "Delete" });     




    [HttpPost] 
    public async Task<HttpResponseMessage> Post(string version, string cardID); 
    { 
    } 

    [HttpDelete] 
    public async Task<HttpResponseMessage> Delete(string version, string cardID); 
    { 
    } 
+0

您正在使用哪个浏览器? IE 8和9不会很好地执行AJAX DELETE/PUT。尝试在请求中添加“X-HTTP-Method-Override:Delete”标题并使用POST。这会触发行动吗? – SimonGoldstone

+0

检查这个答案,并通过您的配置文件 http://stackoverflow.com/questions/10906411/asp-net-web-api-put-delete-verbs-not-allowed-iis-8 –

回答

0

从上面的代码中,我认为有图案{version}/cards/{cardID}任何URL将被“RegisterCard”路线,不管动词是什么处理(后/删除)。对于“删除”,将选择“注册卡”路线,然后当[HttpPost]动作选择器进场时,它将导致404错误。如果您遇到404 “删除”,你可能会

ONE 添加约束路线

routes.MapHttpRoute(
    name: "RegisterCard", 
    routeTemplate: "{version}/cards/{cardID}", 
    defaults: new { Controller = "MyController", Action = "Post"}, 
    constraints: new { httpMethod = new HttpMethodConstraint(new[] { "post" }) } 
); 

routes.MapHttpRoute(
    name: "UnregisterCard", 
    routeTemplate: "{version}/cards/{cardID}", 
    defaults: new { Controller = "MyController", Action = "Delete" }, 
    constraints: new { httpMethod = new HttpMethodConstraint(new[] { "delete" }) } 
); 

使一个单一的路径与单一ActionName

routes.MapHttpRoute(
    name: "Card", 
    routeTemplate: "{version}/cards/{cardID}", 
    defaults: new { Controller = "MyController", Action = "HandleCard"} 
); 

[ActionName("HandleCard")] 
[HttpPost] 
public async Task<HttpResponseMessage> Post(string version, string cardID); 
{ 
} 

[ActionName("HandleCard")] 
[HttpDelete] 
public async Task<HttpResponseMessage> Delete(string version, string cardID); 
{ 
} 
在一起,将它们合并

希望这有助于。