2

ASP.Net MVC の WebAPI の RouteHandlers に関する興味深い記事を偶然見つけました。

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

この記事では、デスクトップ Web ブラウザーとモバイル デバイスからの同じ WebAPI 要求がどのように異なるコントローラーにルーティングされるかを示します。この例では、次のように RouteHandler を使用しています。

routes.MapHttpRoute(
               name: "DefaultApi",
               routeTemplate: "api/{controller}/{id}",
               defaults: new { id = RouteParameter.Optional }
           ).RouteHandler = new MyRouteHandler();

このコードは、Global.asax で使用されます。

ただし、HttpConfiguration が config メソッドに渡される App_Start の WebApiConfig を介して WebAPI ルートを登録しています。

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 を処理する機能がありません。config.Routes.MapHttpRoute で RouteHandler を使用するにはどうすればよいですか?

ご協力いただきありがとうございます。

アップデート

さらに調査した結果、探しているものが見つかったと思いますが、このアプローチが良いかどうかはわかりません。

私の目的は、着信要求をインターセプトし、要求のデバイス タイプを特定して、応答を正しいデバイス (デスクトップ、タブレット、モバイルなど) に合わせて調整できるようにすることです。HttpRequestMessage は、ヘッダーと UserAgent 文字列へのアクセスを許可します。UserAgent を分析してデバイスのタイプを判別する方法を見つけました ( http://techbrij.com/display-mode-mobile-tablet-tv-aspnet-mvc )。コントローラー名の後に DeviceType を配置する命名規則を使用しています。

値[DeviceType]コントローラー

例:

  • ValuesController
  • ValuesMobileController
  • ValuesTabletController

UserAgent から devicetype を特定し、RouteData コレクションの Controller 名を交換します。

**注: 以下の DisplayModeConfig.GetDeviceType(userAgent) は、上記のリンクで概説されているアプローチを使用しています

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);
    }
}

デバイスの種類ごとに応答を処理するコントローラーを指示することで、デバイスの種類に合わせて適切な応答を調整することで、ユーザー エクスペリエンスをより適切に制御できます。

このアプローチについてどう思いますか?このアプローチに何か問題はありますか?

4

1 に答える 1

0

あなたの目的を果たすことができるIHttpControllerSelectorと呼ばれるサービスがあります。DefaultHttpControllerSelectorから派生し、代わりにGetControllerNameをオーバーライドできます。

于 2013-02-18T21:02:08.277 に答える