0

同じ名前のコントローラを含む2つの異なるクラスライブラリがあります。Web apiコントローラの選択ルート

namespace OldApiService{ 
    public class GreetingController: ApiController{ 
     public string Get(){ return "hello from old api"; } 
    } 
} 

namespace NewApiService{ 
    public class GreetingController: ApiController{ 
     public string Get(){ return "hello from new api"; } 
    } 
} 

私はRouteと他のヘルパークラスを含む主要なWe Apiアプリケーションを持っています。この出願は、NewApiServiceおよびOldApiServiceアセンブリを参照する。

namespace MyApi { 
    public class Startup 
    {    
     public void Configuration(IAppBuilder appBuilder) 
     { 
      HttpConfiguration config = new HttpConfiguration(); 
      config.Routes.MapHttpRoute( 
       name: "DefaultApi", 
       routeTemplate: "api/{api}/{controller}/{id}", 
       defaults: new { id = RouteParameter.Optional } 
      ); 

      appBuilder.UseWebApi(config); 
     } 
    } 
} 

urlパラメータを指定したコントローラを選択します。

http://localhost:4035/api/old/greetingOldApiServiceコントローラ

http://localhost:4035/api/new/greetingNewApiServiceコントローラ

を使用します使用する私は、URLのルートの設定を変更しようとしましたが、働いていません。重複したコントローラエラーが発生しました。

コントローラの選択メカニズムを無効にする方法はありますか。単にルート値(古いものか新しいもの)を取得し、指定された名前空間からコントローラを選択します。

「挨拶」というコントローラに一致する複数のタイプが見つかりました。 このリクエストに対応するルート ( 'api/{version}/{controller}/{id}')が、同じ名前で異なる名前空間を持つ という複数のコントローラが定義されており、サポートされていない場合に発生します。 「あいさつ」の要求は、次のマッチング コントローラ発見した:OldApiService.GreetingController NewApiService.GreetingController

を、私は、これはasp.netのWeb APIの重要な問題だと思います。

+2

あなたは両方のライブラリの制御が常に存在になるように、ルーティング属性を使用して検討している場合コンベンションに基づくルーティングを介した競合ルートをマッピングするときは、コントロール名にksを指定します。 – Nkosi

+0

RoutePrefix属性を使用してみましたか? – peinearydevelopment

+0

はいRoute属性を試しましたが、うまくいきませんでした。 – barteloma

答えて

1

私はRoutePrefix/Route属性を使用します。

namespace OldApiService{ 
    [RoutePrefix("api/old/greeting")] 
    public class GreetingController: ApiController{ 
     [Route("")] 
     public string Get(){ return "hello from old api"; } 
    } 
} 

namespace NewApiService{ 
    [RoutePrefix("api/new/greeting")] 
    public class GreetingController: ApiController{ 
     [Route("")] 
     public string Get(){ return "hello from new api"; } 
    } 
} 
+0

2つのライブラリの設定を公開する方法を示すことを忘れないでください。 – Nkosi

+0

'greeting'というコントローラに一致する複数のタイプが見つかりました。これは、このリクエストを処理するルート( 'api/{version}/{controller}/{id}')が複数のコントローラを同じ名前で定義されていて、サポートされていない名前空間が異なる場合に発生します。 「挨拶」のリクエストで、次の一致するコントローラが見つかりました:OldApiService.GreetingController NewApiService.GreetingController – barteloma

2

旧図書館

​​

他のライブラリ

namespace NewApiService{ 

    public static class WebApiConfig { 
     public static void Register(HttpConfiguration config) { 
      config.config.MapHttpAttributeRoutes();   
     } 
    } 

    [RoutePrefix("api/new/greeting")] 
    public class GreetingController: ApiController{ 
     [Route("")] 
     public string Get(){ return "hello from new api"; } 
    } 
} 

スタートアップ

namespace MyApi { 

    public class Startup { 
     public void Configuration(IAppBuilder appBuilder) { 

      var config = new HttpConfiguration(); 

      //Map attribute routes 

      OldApiService.WebApiConfig.Register(config); 
      NewApiService.WebApiConfig.Register(config); 

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

      appBuilder.UseWebApi(config); 
     } 
    } 

} 
関連する問題