我正在使用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
实现了该接口,因此这是我包含的程序集。我不确定这是不是正确的。也许这与问题有某种关系?
非常感谢任何帮助。谢谢!