2016-04-15 11 views
1

Ich habe Standard WebAPI Routing-Konfiguration:WebAPI Routing: api/{Controller}/{id} und api/{Controller}/{Aktion} zugleich

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

Ich möchte folgende Szenarien unterstützen:

//api/mycontroller 
public IQueryable<MyDTO> Get(); 

//api/mycontroller/{id} where id can be anything except "customaction1" and "customaction2" 
public HttpResponseMessage Get(string id); 

//api/mycontroller/customaction 
[HttpPost] 
public void CustomAction1([FromBody] string data); 
[HttpPost] 
public void CustomAction2([FromBody] string data); 

ich habe versucht, [Route("api/mycontroller/customaction1")] auf die CustomAction1 Methode anzuwenden, und ähnlich wie CustomAction2 aber immer:

Mehrere Aktionen wurden gefunden, die der Anforderung entsprechen: CustomAction1 auf Typ MyProject.WebApiService.MyController CustomAction2 auf Typ MyProject.WebApiService.MyController

+0

Haben Sie das Attribut Routing konfiguriert? 'config.MapHttpAttributeRoutes()' – Nkosi

+0

Nein. Versucht und funktioniert. Ich werde akzeptieren wie asnwer. Es ist jedoch möglich, das Routing so zu konfigurieren, dass es standardmäßig mit der benutzerdefinierten Aktion ohne die Attribute funktioniert. – Liero

+0

Sie müssten mehr Routen erstellen – Nkosi

Antwort

0

Stellen Sie sicher, dass Sie Attribut konfiguriert mit Standardkonfiguration Routing entlang

//.... 
config.MapHttpAttributeRoutes() 

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

Wenn Sie das gleiche mit out Attribut Routing tun wollen, dann müssen Sie Routen konfigurieren explizit

//This one constrains id to be an int 
config.Routes.MapHttpRoute(
    name: "DefaultApi", 
    routeTemplate: "api/{controller}/{id}", 
    defaults: new { action="Get", id = RouteParameter.Optional }, 
    constraints : new { id = @"\d" } 
); 
//This one should catch the routes with actions included 
config.Routes.MapHttpRoute(
    name: "ActionRoutes", 
    routeTemplate: "api/{controller}/{action}" 
); 
+0

gut, in meinem Fall ID ist eine beliebige Zeichenfolge mit Ausnahme der Aktion Namen – Liero

+0

Oh, ich habe das vermisst. dachte, es sei ein "Int". Das ändert Dinge. Ich muss es erneut überprüfen – Nkosi

Verwandte Themen