我有一个控制器只接受此URL上的POST:
POST http://server/stores/123/products
POST应该是内容类型的application / json,所以这就是我在路由表中的内容:
routes.MapRoute(null,"stores/{storeId}/products",new { controller = "Store",action = "Save" },new { httpMethod = new HttpMethodConstraint("POST"),json = new JsonConstraint() } );
JsonConstraint的位置是:
public class JsonConstraint : IRouteConstraint { public bool Match(HttpContextBase httpContext,Route route,string parameterName,RouteValueDictionary values,RouteDirection routeDirection) { return httpContext.Request.ContentType == "application/json"; } }
当我使用这条路线时,我得到了一个405 Forbidden:
不允许使用用于访问路径’/ stores / 123 / products’的HTTP谓词POST
但是,如果我删除json = new JsonConstraint()约束,它可以正常工作.有人知道我做错了什么吗?
解决方法
我把它放在评论中,但没有足够的空间.
编写自定义约束时,检查routeDirection参数并确保逻辑仅在正确的时间运行非常重要.
该参数告诉您在处理传入请求时是运行约束还是在某人生成URL时运行约束(例如当他们调用Html.ActionLink时).
在你的情况下,我认为你想把所有匹配的代码放在一个巨大的“if”中:
public bool Match(HttpContextBase httpContext,RouteDirection routeDirection) { if (routeDirection == RouteDirection.IncomingRequest) { // Only check the content type for incoming requests return httpContext.Request.ContentType == mimeType; } else { // Always match when generating URLs return true; } }