我正在使用 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
我收到以下错误:
具有路由模板“SchoolInfo/Campus/{id}”的路由上的约束条目“id”必须具有字符串值或实现“IHttpRouteConstraint”的类型。
说明:执行当前 Web 请求期间发生未处理的异常。请查看堆栈跟踪以获取有关错误及其源自代码的位置的更多信息。
异常详细信息:System.InvalidOperationException:具有路由模板“SchoolInfo/Campus/{id}”的路由上的约束条目“id”必须具有字符串值或实现“IHttpRouteConstraint”的类型。
源错误:
在执行当前 Web 请求期间生成了未处理的异常。可以使用下面的异常堆栈跟踪来识别有关异常起源和位置的信息。
堆栈跟踪:
[InvalidOperationException:具有路由模板“SchoolInfo/Campus/{id}”的路由上的约束条目“id”必须具有字符串值或者是实现“IHttpRouteConstraint”的类型。]
System.Web.Http.Routing.HttpRoute .ProcessConstraint(HttpRequestMessage request, Object constraint, String parameterName, HttpRouteValueDictionary values, HttpRouteDirection routeDirection) +293 System.Web.Http.Routing.HttpRoute.ProcessConstraints(HttpRequestMessage request, HttpRouteValueDictionary values, HttpRouteDirection routeDirection) +99
System.Web.Http.Routing .HttpRoute.GetRouteData(String virtualPathRoot, HttpRequestMessage request) +195
AttributeRouting.Web.Http.Framework.HttpAttributeRoute.GetRouteData(String virtualPathRoot,HttpRequestMessage 请求)+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 context) +60
System .Web.Routing.UrlRoutingModule.OnApplicationPostResolveRequestCache(Object sender, 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}")]
,它可以工作。所以问题似乎与默认路由约束有关。问题是我真的希望使用它们,因为我到处都有 id,而且当它总是一个 int 时,不断地指定它的类型似乎是多余的。
我注意到的另一件事是IntRouteConstraint
该类存在于 4 个不同的程序集中:
AttributeRouting.Web.Constraints
AttributeRouting.Web.Http.Constraints
System.Web.Http.Routing.Constraints
System.Web.Mvc.Routing.Constraints
但是,该AddDefaultRouteConstraint()
方法将 anIRouteConstraint
作为其第二个参数,并且只有IntRouteConstraint
inAttributeRouting.Web.Constraints
实现了该接口,所以这就是我包含的程序集。我不确定这是否正确。也许这与问题有关?
任何帮助将非常感激。谢谢!