13

名前に「Api」サフィックスが付いた WebApi コントローラーがあります (例: StudentsApiController、InstructorsApiController)。これは、MVC コントローラーと WebApi コントローラーを簡単に区別するために行います。WebApi ルートを次のようにしたい

http://localhost:50009/api/students/5ではありませんhttp://localhost:50009/api/studentsapi/5

現在、これを達成するために、次のようなルートを設定しています

routes.MapHttpRoute(
name: "GetStudents",
routeTemplate: "api/students/{id}",
defaults: new { controller = "StudentsApi", id = RouteParameter.Optional });

routes.MapHttpRoute(
name: "GetInstructors",
routeTemplate: "api/instructors/{id}",
defaults: new { controller = "InstructorsApi", id = RouteParameter.Optional });

コントローラーのメソッドごとにルートを追加する必要があるため、これは非常に面倒です。ルートの処理中にコントローラー名に「api」サフィックスを自動的に追加するルート テンプレートをセットアップする簡単な方法があることを願っています。

4

4 に答える 4

9

@Youssef Moussaoui の指示に従って、問題を解決する次のコードを書きました。

public class ApiControllerSelector : DefaultHttpControllerSelector
{
    public ApiControllerSelector(HttpConfiguration configuration)
        : base(configuration)
    {
    }

    public override string GetControllerName(HttpRequestMessage request)
    {
        if (request == null)
            throw new ArgumentNullException("request");

        IHttpRouteData routeData = request.GetRouteData();

        if (routeData == null)
            return null;

        // Look up controller in route data
        object controllerName;
        routeData.Values.TryGetValue("controller", out controllerName);

        if (controllerName != null)
            controllerName += "api";

        return (string)controllerName;
    }
}

Global.asax に次のように登録します。

GlobalConfiguration.Configuration.Services.Replace(typeof(IHttpControllerSelector),
            new ApiControllerSelector(GlobalConfiguration.Configuration));
于 2013-01-28T21:17:47.777 に答える
7

あなたが探している拡張ポイントはコントローラーセレクターだと思います。DefaultHttpControllerSelector から派生し、GetControllerName をオーバーライドして「api」部分を削除するクラスを作成できます。その後、このコントローラー セレクターをサービスの構成サービスに登録できます。

于 2013-01-23T17:16:58.197 に答える
1

muruug の回答に対する Youssef のコメントに従うと、次のようになります。

public class ApiControllerSelector : DefaultHttpControllerSelector
{
    public ApiControllerSelector (HttpConfiguration configuration) : base(configuration) { }

    public override string GetControllerName(HttpRequestMessage request)
    {
        return base.GetControllerName(request) + "api";
    }
}
于 2015-07-17T06:53:45.123 に答える