2016-03-19 43 views
0

Ich habe einen Fall, in dem ich keine Standardroute zum Arbeiten über Config.Routes.MapHttpRoute() bekommen kann, aber wenn ich die Route als Routenattribut in den Controller setze, funktioniert es gut.WebAPI MapHttpRoute funktioniert nicht, aber AttributeRouting funktioniert

Global.asax

protected void Application_Start() { 
    AreaRegistration.RegisterAllAreas(); 
    WebApiConfig.Register(GlobalConfiguration.Configuration); 
    FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters); 
    //RouteConfig.RegisterRoutes(RouteTable.Routes); 
    //BundleConfig.RegisterBundles(BundleTable.Bundles); 
} 

(entfernt den letzten zwei, wie sie sind nicht-WebAPI Anforderungen (oder?) Gleiche Ergebnis auch wenn ich sie in verlassen)

WebApiConfig.cs

public static void Register(HttpConfiguration config) { 
     // Web API configuration and services 

     // Web API routes 
     config.MapHttpAttributeRoutes(); 

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

-Controller

public class ErrorsController : ApiController 
{ 

    [HttpGet] 
    [Route("v1/Errors/Get")] 
    public IHttpActionResult Get(int id) { 
     return Ok(); 
    } 

    [HttpPost] 
    [Route("v1/Errors/Submit")] 
    public IHttpActionResult Submit() 
    { 
     // do stuff 
     return Ok(); 
    } 
} 

Wenn ich die Attribute Routen drin habe, funktioniert alles gut. Wenn ich es nicht tue, bekomme ich 404s. Zum Beispiel die beiden folgenden Bericht ein Fehler 404:

localhost:myport/v1/Errors/Get?id=5

localhost:myport/v1/Errors/Submit

Doch, wenn ich angebe dies:

localhost:myport/v1/Errors

erhalte ich die folgende Antwort:

No HTTP resource was found that matches the request URI ' http://localhost:59498/v1/Errors/ '.

No type was found that matches the controller named 'v1'.

Offensichtlich tritt meine Routenkonfiguration nicht ein, aber für das Leben von mir kann ich nicht sagen, warum. Ich habe sogar versucht, den Routennamen zu Default anstelle von DefaultApi zu ändern, denkend, dass vielleicht Default eine interne Bedeutung hatte.

Antwort

1

"Normales" Routing unterstützt diese Art von Routen mit dem Präfix "v1" nicht. Auf die eine oder andere Art folgt diese Art der Aufbereitung dem alten MVC-Routing, wobei der erste Teil der Adresse der Controller sein muss; Wenn Sie also die Adresse localhost:myport/v1/Errors einstellen, sucht das System derzeit nach einem Controller namens "v1".

Wenn Sie eine Route mit einem Präfix verwenden möchten, bevor Sie mit dem Attribut Routing bleiben müssen; deshalb funktioniert es perfekt mit Attributen und nicht ohne.

Darf ich Ihnen vorschlagen, ein "globales" Präfix für die v1-Sache zu verwenden? Auf diese Weise können Sie verhindern, dass derselbe Teil der URL immer wieder auf verschiedenen Ressourcen wiederholt wird. Ich schlage vor, Sie überprüfen this Artikel für ein paar Implementierungsdetails.

+0

Ah ha ... das macht Sinn. Aber um dies zu bestätigen, ist dies für spezielle Routen im Nicht-Web-API-Routing in Ordnung? (Ich habe ähnliche Konstrukte mit Präfixen als nicht standardmäßige Routen in regulären MVC verwendet). Auf jeden Fall danke für die Antwort - jetzt weiß ich warum (und habe auch einen nützlichen Link). – jleach

Verwandte Themen