2016-05-31 5 views
0

私はRoutePrefixを使用しようとしていますが、ASP.NETは部分的に無視しています。以下のコントローラを考える(メソッドの本体とクラスフィールドが削除):ASP.Net Web API RoutePrefixが部分的に無視される

[RoutePrefix("api/users/sharepoint")] 
public class SharePointController : ApiController 
{ 


    public SharePointController(ISharePointUserRepository repo, IAzureUserRepository otherRepo) 
    { 

    } 

    [HttpGet] 
    public ExternalUser Get(int id) 
    { 

    } 

    [HttpGet] 
    public ExternalUser Get(Guid guid) 
    { 

    } 

    [HttpGet] 
    public IEnumerable<ExternalUser> Get() 
    { 

    } 

    [HttpGet] 
    public ExternalUser Get(string username) 
    { 

    } 

    [HttpGet] 
    public IEnumerable<ExternalUser> GetByPersonalEmail(string email) 
    { 

    } 

    [HttpGet] 
    [Route("GetWithDifferences")] 
    public IEnumerable<ExternalUser> GetWithDifferences() 
    { 

    } 

    [HttpGet] 
    [Route("GetUnique")] 
    public IEnumerable<ExternalUser> GetUnique() 
    { 


    } 

    [HttpPost] 
    [Route("search")] 
    public IEnumerable<ExternalUser> Search([FromBody] ExternalUserSearchModel model) 
    { 

    } 

I取得(ホスト/ヘルプを経由して)以下のAPI:

のSharePoint

GET APIを/ユーザ/共有ポイント/ GetWithDifferences
GET API /ユーザ/共有ポイント/ GetUnique
POST API /ユーザ/共有ポイント/検索
GETのAPI/SharePointの/ {ID}
どの、GET API/SharePointの?GUID = {GUID}
GETのAPI/SharePointの
GETのAPI/SharePointの?ユーザ名= {ユーザー名}
GETのAPI/SharePointの?メール= {メール}

テストされ、広告されたとおりに動作します。

公開されているメソッドに対して[ルート(..)]を指定しないと、RoutePrefixは無視されます。しかし、私はGETでデフォルトのアクションが必要なので、これらのルーティングを追加指定したくありません。

[Route(..)]を使用して、デフォルトのGETおよびPOST動作をどのように維持できますか?

答えて

0

RoutePrefixAttribute単独では経路を定義していないため、選択した接頭辞をその属性で装飾されたクラスに定義されたルートに追加します。

RoutePrefixの恩恵を受けるように、属性ルーティングのみを使用し(各方法のルートを定義する)、コードをそのままにして、あなたのURIに準拠した別の規則のルーティングを定義する必要があります。ルーティング属性を使用して

サンプル:

[HttpGet] 
[Route("{id:int}"] 
public ExternalUser Get(int id) 
{ } 

[HttpGet] 
[Route(""] 
public ExternalUser Get(Guid guid) 
{ } 

[HttpGet] 
[Route("")] 
public IEnumerable<ExternalUser> Get() 
{ } 

[HttpGet] 
[Route("")] 
public ExternalUser Get(string username) 
{ } 

そして、ここでは第二のアプローチのための別の例である:

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

    config.Routes.MapHttpRoute(
     name: "MyCustomApi", 
     routeTemplate: "api/users/sharepoint/{id}", 
     defaults: new { controller = "SharePoint", id = RouteParameter.Optional } 
    ); 

    config.Routes.MapHttpRoute(
     name: "DefaultApi", 
     routeTemplate: "api/{controller}/{id}", 
     defaults: new { id = RouteParameter.Optional } 
    ); 
} 
関連する問題