首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >RouteHandler for HttpConfiguration

RouteHandler for HttpConfiguration
EN

Stack Overflow用户
提问于 2013-02-07 15:39:02
回答 1查看 3.1K关注 0票数 2

我偶然发现了一篇关于RouteHandlers for ASP.Net MVC的WebAPI的有趣文章:

http://techbrij.com/separate-web-api-action-mobile-asp-net-mvc

在本文中,它将展示如何将来自桌面web浏览器和移动设备的相同WebAPI请求路由到不同的控制器。该示例使用如下所示的RouteHandler:

代码语言:javascript
复制
routes.MapHttpRoute(
               name: "DefaultApi",
               routeTemplate: "api/{controller}/{id}",
               defaults: new { id = RouteParameter.Optional }
           ).RouteHandler = new MyRouteHandler();

此代码用于Global.asax。

但是,我正在通过WebApiConfig在App_Start中注册WebApiConfig路由,其中HttpConfiguration被传递到配置方法中:

代码语言:javascript
复制
public static class WebApiConfig
{
    public static void Register(HttpConfiguration config)
    {
        config.Routes.MapHttpRoute(
            name: "DefaultApi",
            routeTemplate: "api/{controller}/{id}",
            defaults: new { id = RouteParameter.Optional },
            constraints: null,
            handler: new CustomHttpControllerDispatcher(config)
        );

    }
}

config.Routes.MapHttpRoute没有处理RouteHandler的能力。如何将RouteHandler与config.Routes.MapHttpRoute结合使用?

谢谢你的帮助。

更新

经过进一步的研究,我想我找到了我想要的东西,但不确定这种方法是否好。

我的目标是拦截传入的请求并确定请求的设备类型,这样我就可以根据正确的设备(桌面、平板电脑、移动设备等)定制响应。HttpRequestMessage授予您对标头和UserAgent字符串的访问权限。我找到了一种分析UserAgent以确定设备类型(http://techbrij.com/display-mode-mobile-tablet-tv-aspnet-mvc)的方法。我使用的命名约定是将DeviceType放在控制器名称之后:

ValuesDeviceTypeController

示例:

  • ValuesController
  • ValuesMobileController
  • ValuesTabletController

我从UserAgent中确定设备类型,然后在RouteData集合中交换Controller名称。

**注:下面的DisplayModeConfig.GetDeviceType(userAgent)使用了上述链接中概述的方法

代码语言:javascript
复制
public class CustomHttpControllerDispatcher : HttpControllerDispatcher
{
    public CustomHttpControllerDispatcher(HttpConfiguration configuration): base(configuration)
    {

    }
    protected override Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
    {
        // My stuff here
        var userAgent = request.Headers.UserAgent.ToString();
        var deviceType = DisplayModeConfig.GetDeviceType(userAgent);
        IHttpRouteData routeData = request.GetRouteData();

        switch(deviceType)
        {
            case "mobile":
                {
                    var controller = routeData.Values["controller"].ToString();
                    routeData.Values["controller"] = controller + "Mobile";

                    break;
                }
            case "tablet":
                {
                    var controller = routeData.Values["controller"].ToString();
                    routeData.Values["controller"] = controller + "Tablet";

                    break;
                }
            case "desktop":
                {

                    break;
                }
        }

        return base.SendAsync(request, cancellationToken);
    }
}

通过指导哪个控制器按设备类型处理响应,我可以通过将正确的响应裁剪到设备类型来更好地控制用户体验。

你对这种方法有什么看法?你能看到这种方法有什么问题吗?

EN

回答 1

Stack Overflow用户

发布于 2013-02-18 21:02:08

有一个名为IHttpControllerSelector的服务可以为您的目的服务。您可以从DefaultHttpControllerSelector派生并重写GetControllerName。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14755018

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档