2014-12-16 5 views
8

Ich verwende Routing in meiner WebApi Katana-Anwendung. Ich habe die folgenden zwei Routen-Mappings, die gut funktionieren. Meine Frage ist, kann ich diese zu einem einzigen Routen-Mapping mit optionalen Parametern kombinieren? Ich kann keinen offensichtlichen Weg sehen, dies zu tun und die erforderliche Funktionalität beizubehalten. Ich bin neu in diesem Bereich und habe vielleicht eine Technik vermisst, die mir hilft, dies zu erreichen. Wenn die Routen so bleiben müssen, ist das kein Problem.Routenzuordnungen in WebApi kombinieren

 config.Routes.MapHttpRoute(
      name: "UnRegister", 
      routeTemplate: "api/services/{serviceName}/{location}", 
      defaults: new {controller = "MyController", location = RouteParameter.Optional}); 

     config.Routes.MapHttpRoute(
      name: "UnRegister2", 
      routeTemplate: "api/services/{serviceName}/{instanceId}", 
      defaults: new { controller = "MyController" }); 

Die erforderliche Funktionalität ist ein Service abzumelden, indem Sie die folgenden Details liefern:

Servicename 
Servicename and location 
Servicename and instanceId 

Antwort

11

In ASP.NET Web API 2 Sie Routing-Attribut verwenden können, und Sie müssen nicht definieren alle Ihre Routen auf diese Weise mit MapHttpRoute.

Die Erklärung kann here gefunden werden.

In Ihrem Owin Startup Sie das Attribut aktivieren müssen Routing MapHttpAttributeRoutes mit:

public class Startup 
{ 
    public static void Configuration(IAppBuilder app) 
    { 
     // Configure Web API for self-host. 
     HttpConfiguration config = new HttpConfiguration(); 

     // Enable attribute based routing 
     config.MapHttpAttributeRoutes(); 

     app.UseWebApi(config); 

    } 
} 

und Ihren Controller wie folgt aussehen sollte:

[RoutePrefix("api/service")] 
public class ServicesController : ApiController 
{ 
    [HttpGet] 
    [Route("{location}")] 
    public IHttpActionResult GetByLocation(string location) 
    { 
     return Ok(); 
    } 

    [HttpGet] 
    [Route("{instanceId:int}")] 
    public IHttpActionResult GetByInstanceId(int instanceId) 
    { 
     return Ok(); 
    } 
} 

Wie Sie habe ich RuotePrefix verwendet sehen die Beschränkungen des Endpunkts und der Route zu beschränken, um Parameter einzuschränken, wie in dem Artikel vorgeschlagen. Sie können sogar eigene benutzerdefinierte Einschränkungen erstellen.

Der Artikel schlägt vor, dass Sie das NuGet Paket Microsoft.AspNet.WebApi.WebHost installieren müssen. Das ist nicht mehr notwendig.