【问题标题】:ASP.NET WEB API Self Hosted Attribute RoutingASP.NET WEB API 自托管属性路由
【发布时间】:2014-09-23 16:29:43
【问题描述】:

我有一个托管在 Windows 服务中的 WEB API。我想使用属性路由,但不知道初始化它需要什么[完全]。我在配置函数中有一个对 config.MapHttpAttributeRoutes() 的调用,它位于 MapHttpRoute 调用之上。从我读过的内容来看,我找不到准备属性路由所需的任何其他操作。有人可以具体说明这是如何完成的吗 - 请记住我是自托管而不是 IIS 托管。

作为一个注释,我得到了一个

在控制器“FISController”上找不到与名称“test”匹配的操作。

调用函数时出错。我在函数上有一个 [Route("Test")] 属性。

彼得

【问题讨论】:

    标签: attributes routing


    【解决方案1】:

    好的 - 进行了一些调查,但发现了我的问题所在。在后期,有时最好从头开始工作,这是我必须做的。发现属性路由确实可以与最新的 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);
    

    在大多数情况下,这就是让事情正常运行所必需的。有时做出假设会让你陷入困境。

    彼得

    【讨论】:

    • 感谢您对问题的清晰简洁的描述。我有一个类似的问题,但只有你的解决方案的前半部分解决了我的问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-16
    • 2014-07-01
    • 2013-07-10
    • 2017-03-24
    • 2017-03-17
    • 1970-01-01
    相关资源
    最近更新 更多