を取得し、私は次のよう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;
を使用するには、マイナーの提案を除いて、実施してきた後、1全く簡単な方法はありません知っている。ちょっとfyi ...少し改良すれば、あなたは 'request.GetRouteData()。GetSubRoutes()'を実行してリスト属性のルートを得ることができます... –
ところで、あなたのシナリオは何ですか?属性ルーティングでカスタムコントローラセレクタを使用する方法を知りたいのは興味深いです。 –
@KiranChalla提案をいただきありがとうございます。私は私のシナリオを説明し、残りのコードを追加しましたので、見てみて、私が間違って何かをしている場合は私を修正してください。 –