2016-11-04 12 views
0

私は作成して公開しているASP.NET Web APIを持っています。ここではいくつかの改善を検討していますが、これらの改善には特定の呼び出しの変更が必要です。つまり、既存のクライアントを機能させるためにバージョンアップする必要があります。ASP.NET Web APIでのAPIのバージョン管理

私はこれまでアプリケーションで属性ルーティングを使用しています。メソッドは、RoutePrefixおよびRoute属性を介してコントローラ/アクションによって呼び出されます。

クラスのV2を作成する必要があるときは、実際に変更されたクラスを再作成し、変更されていないため他のルートをv1クラスにリダイレクトします。 (さもなければ、私はあまりにも多くの定型コードやコードを重複してしまいます)。私はV2に行くために、新しいクラスをしたい、と任意のクラスが変更されていないことV2について コントローラ/アクション

は、私は何をしたい、次のルートはクラスの私のv1のバージョンのために働く持っています私はV1クラスからHttpControllerDescriptorを返すしたい。ルートはv2/Controller/Actionのように見えますが、Controller/Actionにリダイレクトされます。

IHttpControllerSelectorを実装し、適切なHttpControllerDescriptorsを返しましたが、メソッドに呼び出しを行っていません。ルーティング情報がアクションに一致しないので、私はそれを信じています。 (IHttpActionSelectorを配置し、例外をトレースすると「要求に一致する複数のアクションが見つかりました」)

これは可能ですか?これは可能なのでしょうか?

+0

これはあなたを助けるかもしれません:http://www.culbertsonexchange.com/wp/?p = 318。あなたがあなたの質問に言及したことを達成したいのであれば、属性ルーティングのための独自のカスタムロジックを実装する必要があります。 –

答えて

0

ここでは、asp.net web apiでバージョン管理をサポートするために実装したものを紹介します。重要なのはWebApiConfig.csの属性ルーティングは使用していませんでした。このパターンを明示的なルートに戻す必要があります。また、私は実際のルートでバージョン情報を好みません。私はAcceptヘッダーでカスタム(すなわち "バージョン")パラメータを使用します。クライアントがバージョン番号を設定していない場合、または要求されたバージョンが存在しない場合、これは以下のようになります。デフォルトのコントローラに戻ります。

  1. クラスを作成し、あなたが望んだときに、基本クラスの振る舞いにフォールバックできるようDefaultHttpControllerSelectorから継承します。

  2. 上書きSelectControllerような方法:

    公共オーバーライドHttpControllerDescriptor SelectController(HttpRequestMessageリクエスト) {

たIDictionaryコントローラ= GetControllerMapping()。 IHttpRouteData routeData = request.GetRouteData();

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

       HttpControllerDescriptor controllerDescriptor; 

       if (string.IsNullOrWhiteSpace(controllerName)) 
       { 
        return base.SelectController(request); 
       } 

       if (!controllers.TryGetValue(controllerName, out controllerDescriptor)) 
       { 
        return null; 
       } 

       string version = GetVersionFromAcceptHeader(request); 
       if (string.Equals(version, "1")) 
       { 
        return controllerDescriptor; 
       } 

       string newName = string.Concat(controllerName, "V", version); 

       HttpControllerDescriptor versionedControllerDescriptor; 
       if (controllers.TryGetValue(newName, out versionedControllerDescriptor)) 
       { 
        return versionedControllerDescriptor; 
       }   

       return controllerDescriptor; 
      } 
  • あなたwebapiconfigにRegister方法このコントローラセレクタを登録:

    config.Services.Replace(typeof演算(IHttpControllerSelector)、新しいYourControllerSelector(設定します))。

  • 関連する問題