7

ASP.NETMVC4でWebAPIを使用しています。

私は次の名前のコントローラーを持っています

  • CustomerController:コントローラー
  • CustomerApiController:ApiController

以前、私CustomerApiControllerCustomersControllerそれにアクセスするために名前が付けられていたので、次のURLをパンチする必要がありました

localhost / api / Customers

しかし今、私はapiコントローラー名をとして保持する必要がありCustomerApiControllerます。どのような変更を加える必要があるかを使用して、同じ方法を実行できるようにしたいlocalhost/api/Customersですか?

RouteConfig.csファイルに変更を加えてみました。RegisterRoutesメソッドに以下を追加しようとしましたが、どれも機能しませんでした。

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

routes.MapRoute(
            name: "Customers",
            url: "api/customer/",
            defaults: new { controller = "CustomerApi", action = "Get", id = UrlParameter.Optional }
        );

誰かがこれについて私を案内してくれませんか。ありがとう

4

2 に答える 2

14

コードには2つの問題があります。MapHttpRouteの代わりにMapRouteを使用しています。また、より一般的なルートに飲み込まれないように、より詳細なルートを最初に配置する必要があります。

routes.MapHttpRoute(
    name: "Customer",
    url: "api/Customer/{id}",
    defaults: new { controller = "CustomerApi", action = "Get", id = UrlParameter.Optional }
); 

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

これで、ソリューションをより一般的にしたい場合(このように変更する必要のあるコントローラーが多い場合)、カスタムを使用HttpControllerRouteHandlerして着信コントローラー名を変換できます。これにより、デフォルトのルーティングを維持できます。

まず、カスタムを作成する必要がありますHttpControllerRouteHandler

public class CustomHttpControllerRouteHandler : HttpControllerRouteHandler
{
    protected override IHttpHandler GetHttpHandler(RequestContext requestContext)
    {
        requestContext.RouteData.Values["controller"] = requestContext.RouteData.Values["controller"].ToString() + "Api";

        return base.GetHttpHandler(requestContext);
    }
}

これで、次のようにHttpRouteを登録できます。

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

このように、 CustomerをURLに入れると、エンジンはそれをCustomerApiのように扱います。

于 2012-10-05T09:50:36.760 に答える
0

DefaultHttpControllerSelectorを拡張し、GetControllerNameをオーバーライドして、カスタムルールを適用できます。デフォルトの実装では、ルートデータから「コントローラー」変数の値を返すだけです。カスタム実装は、これを他の値にマップできます。ルーティングとアクションの選択を参照してください。

于 2012-10-05T14:59:24.530 に答える