2013-10-23 5 views
8

を取得し、私は次のようWebApiConfig.csでコントローラ名

public static void Register(HttpConfiguration config) 
{ 

    config.MapHttpAttributeRoutes(); 

    config.Services.Replace(typeof(IHttpControllerSelector), 
       new MyApiControllerSelector(config)); 

    //code omitted for brevity 
} 

が、その後MyApiControllerSelector.csに私は、コントローラ

public override HttpControllerDescriptor SelectController(HttpRequestMessage request) 
     {   
      var routeData = request.GetRouteData();   

      var controllerName = (string)routeData.Values["controller"]; 

      //code omitted for brevity 
     } 

は非常にシンプル取得したいしていると、それは今とてもうまくいったが、 属性ルーティングを使用しています。私はそれには異なるアプローチが必要だと思いますか? - 私は簡単な方法

を見つけることができないよう、私は動作しません

var controllerName = request.GetActionDescriptor().ControllerDescriptor.ControllerName; 

を試してみました。そして、デバッグにsourceを読ん

は今、私は動作しますが、それは簡単な方法でなければなら

string subRoutesKey = "MS_SubRoutes"; 

var attributedRoutesData = routeData.Values[subRoutesKey] as IEnumerable<IHttpRouteData>; 
var subRouteData = attributedRoutesData.FirstOrDefault(); 

var actions = (ReflectedHttpActionDescriptor[])subRouteData.Route.DataTokens["actions"]; 
var controllerName = actions[0].ControllerDescriptor.ControllerName; 

を持っているので、request.GetRouteData().Values["MS_SubRoutes"]

に私を導きますか?

UPDATE

@KiranChallaは私のユースケースは、私は残りのコードを掲示しています何尋ねました。 基本的に私は、バージョンメディアタイプAccept: application/vnd.app.{resource}.v{version}+jsonを要求から解析し、バージョンによってHttpControllerDescriptorを返します。

  HttpControllerDescriptor oldControllerDescriptor; 
      if (controllers.TryGetValue(controllerName, out oldControllerDescriptor)) 
      { 
       var apiVersion = GetVersionFromMediaType(request); 

       var newControllerName = String.Concat(controllerName, "V", apiVersion); 

       HttpControllerDescriptor newControllerDescriptor; 
       if (controllers.TryGetValue(newControllerName, out newControllerDescriptor)) 
       {      
        return newControllerDescriptor; 
       }    
       return oldControllerDescriptor; 
      } 
      return null; 
+2

を使用するには、マイナーの提案を除いて、実施してきた後、1全く簡単な方法はありません知っている。ちょっとfyi ...少し改良すれば、あなたは 'request.GetRouteData()。GetSubRoutes()'を実行してリスト属性のルートを得ることができます... –

+0

ところで、あなたのシナリオは何ですか?属性ルーティングでカスタムコントローラセレクタを使用する方法を知りたいのは興味深いです。 –

+0

@KiranChalla提案をいただきありがとうございます。私は私のシナリオを説明し、残りのコードを追加しましたので、見てみて、私が間違って何かをしている場合は私を修正してください。 –

答えて

11

@KiranChallaによって確認されたように、私はすでに、私は私が他の簡単な方法が存在しないと信じてGetSubRoutes()

var attributedRoutesData = request.GetRouteData().GetSubRoutes(); 
var subRouteData = attributedRoutesData.FirstOrDefault(); 

var actions = (ReflectedHttpActionDescriptor[])subRouteData.Route.DataTokens["actions"]; 
var controllerName = actions[0].ControllerDescriptor.ControllerName; 
+0

このソリューションのパフォーマンス上の問題はありますか? – ainteger

+1

@aintegerいいえ、それはパイプラインから必要なデータ(コントローラ名)を取得するための別のアプローチです。 –

+0

'GetSubRoutes()'の使用は、優れたものです。 'MS_SubRoutes'を使うことは、文書化されていない文字列リテラルに依存しているためです。 – BitMask777

関連する問題