0

我正在使用 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作为其第二个参数,并且只有IntRouteConstraintinAttributeRouting.Web.Constraints实现了该接口,所以这就是我包含的程序集。我不确定这是否正确。也许这与问题有关?

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

4

0 回答 0