2016-05-31 8 views
0

ignoriert Ich versuche RoutePrefix zu verwenden, aber ASP.NET ignoriert es teilweise. In Anbetracht der folgenden Controller (Methodenrümpfe und Klassenfelder entfernt):ASP.Net Web API RoutePrefix teilweise

[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) 
    { 

    } 

Ich erhalte die folgende API (über Host/help):

Sharepoint

GET api/users/Sharepoint/GetWithDifferences
GET api/users/Sharepoint/GetUnique
POST api/users/Sharepoint/search
GET api/Sharepoint/{id}
api/Sharepoint GET? Guid = {guid}
GET api/Sharepoint
GET api/Sharepoint? Username = {username}
GET api/Sharepoint? Email = {email}

die, wenn sie getestet, funktioniert wie angekündigt.

Wie Sie die RoutePrefix sehen ignoriert, wenn ich nicht ein [Weg (..)] für die exponierten Methoden angeben. Allerdings möchte ich Aktionen auf GET Standard, so dass ich möchte keine zusätzliche Routing für diese angeben.

Wie kann ich die RoutePrefix erzwingen, oder alternativ, wie kann ich pflegen Standard GET und POST-Verhalten mit [Routen (..)]?

Antwort

0

RoutePrefixAttribute allein definiert keine Route, es wird nur die gewählte Präfix zu jeder Route in der mit einem solchen Attribut versehen Klasse definiert hinzuzufügen.

Sie müssen dann folgende Auswahl treffen: Verwenden Sie nur Attribut-Routing (und definieren Sie eine Route für jede Methode), damit Sie von RoutePrefix profitieren oder den Code beibehalten und ein anderes Konvention-Routing definieren können, das Ihren URIs entspricht.

Probe mit Attribut-Routing:

[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) 
{ } 

Und hier ist es ein weiteres Beispiel für den zweiten Ansatz:

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 } 
    ); 
}