2015-04-06 108 views
2

我有一个ASP.NET MVC 5控制器使用属性路由,似乎没有使用DELETE操作。ASP.NET MVC删除操作没有解雇

[Route("deletealbum/{id}")] 
[AcceptVerbs(HttpVerbs.Delete)] 
public ActionResult DeleteAlbum(int id) 
{ 
    // rest of the code omitted here 
    return Json(true, JsonRequestBehavior.AllowGet); 
} 

我明确地将路由名更改为deletename以排除其他路由过载冲突。

上述操作不会触发 - 我得到一个404没有从IIS找到。但是,如果我将上述操作切换到HttpVerbs.Get,则路线没有问题。

第一次长时间用MVC而不是Web API构建API,我无法弄清楚为什么路由没有被触发 - 它几乎看起来像任何DELETE操作都被阻塞了。我在不同的控制器中看到相同的行为 - GET工作正常,但DELETE操作返回404。是否需要翻转一些配置设置以启用其他动词?

+0

在什么样的行动resul t是发生的删除操作?我在问,因为在一个标准的mvc应用程序(不是api,而不是json)中,HttpGet必须与路径属性中的HttpPost具有相同的名称。 – 2015-04-06 09:23:53

+0

@gerdi - 不知道我理解你的问题。路线是独一无二的(尽管我真的想和GET/POST/PUT一样 - 也就是专辑/ {id}),但为了确保没有一些路线解决问题,我使用了一个唯一的名称。我不知道基于MVC中的动词的属性路由中的名称有任何限制。 – 2015-04-06 09:59:48

+0

WebDAV可能是问题,值得检查:http://stackoverflow.com/questions/10906411/asp-net-web-api-put-delete-verbs-not-allowed-iis-8 – tugberk 2015-04-06 10:06:04

回答

6

this answer to a similar question

中更详细描述您可能需要启用删除这可能是由于IIS配置问题(和PUT,如果你需要它)在你的IIS的配置是这样的:

之前:

<add name="ExtensionlessUrl-Integrated-4.0" path="*." verb="GET,HEAD,POST,DEBUG" type="System.Web.Handlers.TransferRequestHandler" preCondition="integratedMode,runtimeVersionv4.0" /> 

后:

<add name="ExtensionlessUrl-Integrated-4.0" path="*." verb="GET,HEAD,POST,DEBUG,PUT,DELETE" type="System.Web.Handlers.TransferRequestHandler" preCondition="integratedMode,runtimeVersionv4.0" /> 
+1

就是这样!我已经添加了WebDav解决方法,但没有添加无扩展名的URL。这是一个痛苦 - 奇怪的是,这似乎是没有显式配置更改的Web API应用程序。 – 2015-04-06 10:15:55

+0

是的,这是一种痛苦 - 很好,你得到它的工作:) – 2015-04-06 10:18:44