好的 - 进行了一些调查,但发现了我的问题所在。在后期,有时最好从头开始工作,这是我必须做的。发现属性路由确实可以与最新的 WEB API [V2.x] 一起使用,操作非常少 - 通常确保调用使用的 HttpConfiguration 上的 MapHttpAttributeRoutes 操作 - 并且在常规映射之前 - 这在文档中有点模棱两可.
我的主要问题确实涉及我添加的破坏属性路由机制的功能。第一个处理以分层方式设计我的控制器 - 我有基类,其中放置核心操作,然后从这些操作派生。当属性路由应用于基本操作时,它们不会通过属性路由激活,因为似乎没有从显式控制器查看基类。我的猜测是,使用 OO 概念就是这种情况。发现调用 HttpConfiguration 时需要进行修改,该修改为可以调用重试基本操作的函数提供 DefaultDirectRouteProvider 对象:
public class CustomDirectRouteProvider : DefaultDirectRouteProvider
{
protected override IReadOnlyList<IDirectRouteFactory> GetActionRouteFactories(HttpActionDescriptor actionDescriptor)
{
return actionDescriptor.GetCustomAttributes<IDirectRouteFactory>(inherit: true);
}
}
我在另一个 SO 响应中发现了这个
.NET WebAPI Attribute Routing and inheritance
这被描述为即将推出的功能 - 现在看起来已经发布了。
我的第二个问题处理了一个自定义的 DefaultHttpControllerSelector,它评估了命名空间中提供的版本标记,在线找到了该功能,但在评估属性路由时没有考虑到它。仅通过在使用属性路由时调用基本操作来修复。
public HttpControllerDescriptor SelectController(HttpRequestMessage request)
{
IHttpRouteData routeData = request.GetRouteData();
if (routeData == null)
{
throw new HttpResponseException(HttpStatusCode.NotFound);
}
string namespaceName = string.Empty;
// Get the namespace and controller variables from the route data.
if (routeData.GetType() == typeof(HttpRouteData))
{
namespaceName = GetRouteVariable<string>(routeData, NamespaceKey);
if (namespaceName == null)
{
throw new HttpResponseException(HttpStatusCode.NotFound);
}
}
else
return base.SelectController(request);
在大多数情况下,这就是让事情正常运行所必需的。有时做出假设会让你陷入困境。
彼得