1

I Attribut mit Web-API-Routing verwenden bin, und alles funktioniert wie erwartet, wenn ich die URL anfordern /MyApi/Liste mit den folgenden Controller:Standardroute bei der Verwendung von ASP.NET MVC Attribute Routing

[RoutePrefix("myapi")] 
public class MyController : ApiController 
{ 
    [HttpGet] 
    [Route("list")] 
    public async Task<string> Get() 
    { 
     // Return result 
    } 
} 

Allerdings würde ich meine Get() Methode, wie der Standard, das heißt, wenn die /MyApi (ohne /Liste Teil) URL anfordern.

Aber wenn ich die "Liste" Teil der Strecke Attribute wie so entfernen ...

[RoutePrefix("myapi")] 
public class MyController : ApiController 
{ 
    [HttpGet] 
    [Route] // Default route 
    public async Task<string> Get() 
    { 
     // Return result 
    } 
} 

... Ich bekomme einen 403,14 Fehler sagen

"Der Webserver ist so konfiguriert, dass er den Inhalt dieses Verzeichnisses nicht auflistet."

Irgendwelche Ideen, was könnte dies verursachen?

Danke!

Edit: Wenn ich die API-Controller mit der Standardroute Muster wie /api/MyApi anfordern, es Karten zum Get() Methode wie erwartet.

Standardroute ist nach dem Attribut Routen registriert:

public static void Register(HttpConfiguration config) 
    { 
     config.MapHttpAttributeRoutes(); 

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

Haben Sie ein physisches/virtuelles Verzeichnis namens 'myapi'? – haim770

+0

@ haim770 Hmm, das scheint das Problem zu sein! Wenn ich mein Routenpräfix umbenenne, funktioniert die Standardroute wie erwartet! Vielen Dank für deine Hilfe! Fühlen Sie sich frei, es als Antwort zu posten und ich werde es akzeptieren. :) –

+1

Es erinnerte mich nur an http://Stackoverflow.com/a/24533925/1625737 - Nicht sicher, ob es als Duplikat obwohl – haim770

Antwort

0

Wie spitze o ut von haim770 in den Kommentaren: das Problem war, dass ich einen physischen Ordner mit dem gleichen Namen als Routenpräfix hatte.

Das Umbenennen des Ordners oder des Routenpräfixes löste das Problem.

Ich denke, eine Alternative wäre gewesen, die Route/Handler-Reihenfolge zu optimieren, um sicherzustellen, dass Attributwege Vorrang vor physischen Pfaden haben.

+1

Eine andere mögliche Lösung ist die Verwendung von 'routes.RouteExistingFiles = true', wie in der Antwort erwähnt, mit der ich verlinkt bin – haim770

0

Verwenden

[Route("")] 

für die Standardroute

[RoutePrefix("myapi")] 
public class MyController : ApiController 
{ 
    //GET myapi 
    [HttpGet] 
    [Route("")] // Default route 
    public async Task<string> Get() { ... } 
} 

Referenz: Attribute Routing in ASP.NET Web API 2 : Route Prefixes

+0

Dank @Nkosi qualifiziert ist, aber ich scheine ein Attribut namens ** Default ** zu fehlen? –

+0

Das war ein Tippfehler.Entschuldigung – Nkosi

+0

Ah, ok! :) Ich habe versucht mit ** ** ** und ** "~ /" ** als Argumente für das ** Route ** Attribut, aber es ergibt das gleiche Ergebnis. :/ –