MVC Web API属性路由:路由约束错误

时间:2013-10-25 22:06:01

标签: asp.net asp.net-mvc asp.net-web-api asp.net-web-api-routing attributerouting

我正在使用Web API nuget包的属性路由。

我的RegisterRoutes(HttpCollection routes)方法如下所示:

public static void RegisterRoutes(HttpRouteCollection routes) 
{
    routes.MapHttpAttributeRoutes(config =>
    {
        config.AddRoutesFromAssembly(Assembly.GetExecutingAssembly());
        config.AutoGenerateRouteNames = true;
        config.InMemory = true;
        config.PreserveCaseForUrlParameters = true;

        // Define type constraints for parameters on GETs
        config.AddDefaultRouteConstraint("id", new IntRouteConstraint());
        config.AddDefaultRouteConstraint("studentId", new IntRouteConstraint());
        config.AddDefaultRouteConstraint("campusId", new IntRouteConstraint());
    });
}

这是我的一个控制器(为简洁起见删除了注释):

[AttributeRouting.RoutePrefix("SchoolInfo/Campus")]
public class CampusController : ApiControllerBase
{
[ResponseType(typeof(CampusApiEntity))]
[GET("{id}")]
public HttpResponseMessage Get(int id)
    {
        // Do stuff here - not important for the question
    }
}

我遇到的问题是我可以像这样访问上述方法: http://localhost:55697/schoolinfo/campus?id=2

但是当我尝试这样做时: http://localhost:55697/schoolinfo/campus/2

我收到以下错误:

  

具有路径模板的路径上的约束条目“id”   'SchoolInfo / Campus / {id}'必须具有字符串值或类型   它实现了'IHttpRouteConstraint'。

     

描述:执行期间发生了未处理的异常   当前的网络请求。请查看堆栈跟踪了解更多信息   有关错误的信息以及它在代码中的起源。

     

异常详细信息:System.InvalidOperationException:约束   使用路线模板'SchoolInfo / Campus / {id}'在路线上输入'id'   必须具有字符串值或具有实现的类型   'IHttpRouteConstraint'。

     

来源错误:

     

执行期间生成了未处理的异常   当前的网络请求。有关的来源和位置的信息   可以使用下面的异常堆栈跟踪来识别异常。

     

堆栈追踪:

     

[InvalidOperationException:路由上的约束条目'id'   使用路径模板'SchoolInfo / Campus / {id}'必须具有字符串值   或者是一种实现'IHttpRouteConstraint'的类型。]
  System.Web.Http.Routing.HttpRoute.ProcessConstraint(HttpRequestMessage   请求,对象约束,字符串parameterName,   HttpRouteValueDictionary值,HttpRouteDirection routeDirection)   +293 System.Web.Http.Routing.HttpRoute.ProcessConstraints(HttpRequestMessage)   请求,HttpRouteValueDictionary值,HttpRouteDirection   routeDirection)+99
  System.Web.Http.Routing.HttpRoute.GetRouteData(String virtualPathRoot,   HttpRequestMessage请求)+195
  AttributeRouting.Web.Http.Framework.HttpAttributeRoute.GetRouteData(字符串   virtualPathRoot,HttpRequestMessage request)+131
  System.Web.Http.WebHost.Routing.HttpWebRoute.GetRouteData(HttpContextBase   httpContext)+107
  System.Web.Routing.RouteCollection.GetRouteData(HttpContextBase   httpContext)+233
  System.Web.Routing.UrlRoutingModule.PostResolveRequestCache(HttpContextBase   上下文)+60
  System.Web.Routing.UrlRoutingModule.OnApplicationPostResolveRequestCache(对象   发件人,EventArgs e)+82
  System.Web.SyncEventExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute()   +136 System.Web.HttpApplication.ExecuteStep(IExecutionStep step,Boolean& completedSynchronously)+69

     

版本信息:Microsoft .NET Framework版本:4.0.30319;   ASP.NET版本:4.0.30319.18044

我不确定如何解决此问题,因为我已经为id参数指定了约束。当我搜索错误时,我发现的唯一结果涉及设置我上面已经拥有的配置设置。

我检查了我的routes.axd文件,我确实在那里:

GET, HEAD, OPTIONS  SchoolInfo/Campus/{id}  controller: Campus, action: Get, id: IntRouteConstraint, namespaces: [MyAssemblyName].Controllers.SchoolInfo, defaultSubdomain: www, routeName: Campus_Get_1

有什么想法吗?

更新

如果我将GET属性从[GET("{id}")]更改为[GET("{id:int}")],则可行。所以问题似乎与默认路由约束有关。问题是我真的希望使用那些,因为我已经遍布整个地方,当它总是一个int时,不断指定它的类型似乎是多余的。

我注意到的另一件事是IntRouteConstraint类在4个不同的程序集中找到:

AttributeRouting.Web.Constraints
AttributeRouting.Web.Http.Constraints
System.Web.Http.Routing.Constraints
System.Web.Mvc.Routing.Constraints

但是,AddDefaultRouteConstraint()方法将IRouteConstraint作为其第二个参数,并且只有IntRouteConstraint中的AttributeRouting.Web.Constraints实现了该接口,因此这是我包含的程序集。我不确定这是不是正确的。也许这与问题有某种关系?

非常感谢任何帮助。谢谢!

0 个答案:

没有答案