9

ASP.NET MVC 4 アプリがあります。学習目的で新しい Web API 機能を使用したいと考えています。同じエンドポイントを公開する方法を学びたいが、それの異なるバージョンを提供したい. つまり、次のようなエンドポイントを公開したいと考えています。

http://mysite/1.0/Products/1
http://mysite/2.0/Products/1

これを行うために、デフォルトの「Controllers」ディレクトリ内に「Api」ディレクトリを追加しました。「Api」ディレクトリ内には、「Version1-0」と「Version2-0」という 2 つのディレクトリがあります。これらの各ディレクトリには、「ProductsController」という名前の ApiController があります。

WebApiConfig.cs ファイルに次のルート定義を追加して、エンドポイントを公開しようとしました。

config.Routes.MapHttpRoute(
  name: "1-0Api",
  routeTemplate: "api/1.0/{controller}/{id}",
  defaults: new { id = RouteParameter.Optional }
);

残念ながら、上記の URL を介してアクションを公開する方法がわかりません。私は何を間違っていますか?ありがとうございました!

4

5 に答える 5

7

コントローラーの名前が同じであるため、おそらく問題が発生しています。コントローラーの名前空間またはそれが含まれるフォルダーは、WebAPI にはまったく関係なく、名前のみが関係します。私が考えることができる最も簡単なことは、コントローラーの名前を ProductsV1Controller と ProductsV2Controller に変更し、コントローラーを指すように 2 つのルートを設定することです。

config.Routes.MapHttpRoute(
    name: "1-0Api",
    routeTemplate: "api/1.0/Products/{id}",
    defaults: new { controller = "ProductsV1", id = RouteParameter.Optional }
);
config.Routes.MapHttpRoute(
    name: "2-0Api",
    routeTemplate: "api/2.0/Products/{id}",
    defaults: new { controller = "ProductsV2", id = RouteParameter.Optional }
);

もちろん、この方法で公開したいコントローラーが複数ある場合、これは面倒です。あなたにとってもっと良いことを考えられないかどうか見てみましょう。

于 2012-12-21T01:28:52.593 に答える
5

Sebastiaan Dammann は、自身のブログで、IHttpControllerSelectorインターフェースの実装とサポートを独自に作成して Web API のバージョン管理を行った方法について説明しています。

http://damsteen.nl/blog/implementing-versioning-in-asp.net-web-api

彼はまた、コードを github に置いています。

https://github.com/Sebazzz/SDammann.WebApi.Versioning

NuGet にパッケージ化してくれました。:)

https://nuget.org/packages/SDammann.WebApi.Versioning

実装IHttpControllerSelectorは確かに (私見ですが) Web API のバージョン管理を行う正しい方法ですが、HTTPヘッダーに基づいてバージョン管理する機能が含まれていれば理想的だと思いますAccept( http://barelyenough.org/blog/2008/05/を参照)。 versioning-rest-web-services/ )。

残念ながら、私のクライアント側はAcceptヘッダーを操作できないため、彼RouteVersionedControllerSelectorは私にとって理想的です。

編集:どのように見逃したのかわかりませんが、理想的なAcceptHeaderVersionedControllerSelector方法でバージョン管理を行うために使用できる があります。現在、新しいプロジェクトで使用していますが、まだいくつかの欠点があります

于 2013-02-26T16:41:24.910 に答える
1

URL を使用した Web Api 2 でのHttpControllerSelctor 実装コントローラーのバージョン管理の使用

詳細については、こちらを確認してください

于 2015-04-05T19:42:45.640 に答える
1

既定の Web API ルートがまだ定義されていて、それがカスタム ルートの前にある可能性はありますか? これにより、シナリオが失敗します。次のルート定義(順序に注意してください)がうまくいきました。

public static void Register(HttpConfiguration config) {
    config.Routes.MapHttpRoute(
        name: "1-0Api",
        routeTemplate: "api/1.0/{controller}/{id}",
        defaults: new { id = RouteParameter.Optional }
    );

    config.Routes.MapHttpRoute(
        name: "DefaultApi",
        routeTemplate: "api/{controller}/{id}",
        defaults: new { id = RouteParameter.Optional }
    );
}
于 2012-12-27T18:47:46.753 に答える