2016-05-31 54 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) 
    { 

    } 

我碰到下面的API(通過主機/幫助):

的SharePoint

獲取API /用戶/共享點/ GetWithDifferences
獲取API /用戶/共享點/ GetUnique
POST API /用戶/共享點/搜索
獲取API /的SharePoint/{ID}
獲取API /的SharePoint?GUID = {GUID}
獲取API /的SharePoint
獲取API /的SharePoint?用戶名= {名}
獲取API /的SharePoint?電子郵件= {電子郵件}

,當測試,按廣告方式工作。

正如你所看到的,當我沒有爲暴露的方法指定[Route(..)]時,RoutePrefix被忽略。不過,我希望對GET進行默認操作,所以我不想爲這些指定任何其他路由。

如何強制執行RoutePrefix,或者,如何使用[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 } 
    ); 
}