ASP.NET WEB API自托管属性路由

时间:2014-07-31 16:03:32

标签: attributes routing

我在Windows服务中托管了一个WEB API。我想使用属性路由,但无法确定完全初始化它所需的内容。我在配置函数中调用了config.MapHttpAttributeRoutes(),它位于MapHttpRoute调用之上。从我读过的内容中,我找不到准备属性路由所需的任何其他操作。有人可以说明如何做到这一点 - 记住我自己托管而不是IIS托管。

作为一个说明,我得到了一个

在控制器上没有找到任何操作' FISController'符合名称' test'。

调用该函数时出现

错误。我在函数上有[Route(" Test")]属性。

彼得

1 个答案:

答案 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);

对于大多数人而言,要使事情正常运作需要什么。有时做出假设可以让你深入了解。

彼得