如何使用约束中指定的动词以外的动词制作MVC丢弃请求?

时间:2011-10-03 08:47:27

标签: asp.net asp.net-mvc iis url-routing asp.net-mvc-routing

在我的MVC应用程序中,我想要在web.config中<httpHandlers>中先前指定的行为,即如果我注册这样的处理程序:

<system.webServer>
    <handlers>
        <add name="processData" verb="POST" path="processData" type="RightType, RightAssembly"/>
    </handlers>
</system.webServer>

然后对/processData的所有具有除“POST”之外的动词的请求都会导致HTTP 404。

我尝试注册这样的路线:

routes.MapRoute(
    @"ProcessData", @"processData",
    new { controller = @"Api", action = @"ProcessData" },
    new { httpMethod = new HttpMethodConstraint( "POST" ) } );

现在一旦请求有POST以外的动词,路由不匹配,路由解析就会失败并进入默认页面。

一旦路径匹配但是动词不匹配,我如何让MVC产生HTTP错误消息(代码404或类似的东西)?

2 个答案:

答案 0 :(得分:2)

您可以使用您不想要的动词注册另一条路线,并使其导致NotFound动作。

答案 1 :(得分:0)

路由按照指定的顺序执行路由,直到找到匹配的路由。通过添加约束,您可以使此路由失败,从而在列表中向下查找下一个匹配路由(默认值)。

要获得您想要的行为,您需要让路由捕获请求,然后处理错误。

将约束从路线中取出并在控制器上执行以下操作:

[HttpPost]
public ActionResult processData(myModel myPostedModel)
{
    DoStuff();
    Return View();
}

public ActionResult processData()
{
    throw new HttpException(404);
}

我假设您在此处对您的操作方法进行模型绑定,因为您确实需要不同的方法签名。如果没有,那么你需要取消HttpPost属性并测试那里的请求方法。