我在Windows服务中托管了一个WEB API。我想使用属性路由,但无法确定完全初始化它所需的内容。我在配置函数中调用了config.MapHttpAttributeRoutes(),它位于MapHttpRoute调用之上。从我读过的内容中,我找不到准备属性路由所需的任何其他操作。有人可以说明如何做到这一点 - 记住我自己托管而不是IIS托管。
作为一个说明,我得到了一个
在控制器上没有找到任何操作' FISController'符合名称' test'。
调用该函数时出现错误。我在函数上有[Route(" Test")]属性。
彼得
答案 0 :(得分:1)
好的 - 进行了一些调查,但发现我的问题是什么。在后台有时候,从一开始我就不得不回溯工作,这就是我必须要做的事情。发现确实属性路由确实可以使用最新的WEB API [V2.x]进行非常小的操作 - 通常确保调用所使用的HttpConfiguration上的MapHttpAttributeRoutes操作 - 并且在常规映射之前 - 这在文档中有点模棱两可
我的主要问题确实涉及我添加的功能,这打破了属性路由机制。第一个涉及以分层方式设计我的控制器 - 在那里我有基类,其中放置核心动作然后从那些动作中派生出来。当属性路由应用于基本操作时,它们不会通过属性路由激活,因为它似乎没有完成从显式控制器查看基类。我的猜测是使用OO概念就是这种情况。发现在调用HttpConfiguration时需要进行修改,该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);
对于大多数人而言,要使事情正常运作需要什么。有时做出假设可以让你深入了解。
彼得