Wie ändern Sie die Standard-Web-API-Routen des Frameworks?

8

Es scheint, dass es eine integrierte Standardlogik für die Web-API gibt, die das HTTP-Verb als Aktionsname verwendet, wenn in der URL keine Aktion angegeben wurde. Zum Beispiel habe ich diese Route:

%Vor%

Und hier sind meine Aktionen:

%Vor%

Wenn ich mit einem GET-Verb zu ~ / Conferences gehe, führt das zur Aktion "Get ()". Wenn Sie das POST-Verb verwenden, gelangen Sie zur Aktion "Post ([FromBody] Conference-Wert)" ... und so fort. Es gibt jedoch einen Konflikt, wenn Sie versuchen, zu ~ / Conferences / GetCurrent zu wechseln (obwohl ich [ActionName ("current")] oben):

  

Es wurden mehrere Aktionen gefunden, die der Anfrage entsprechen:   System.Collections.Generic.IEnumerable 1[MyApp.Models.Conference] Get() on type MyApp.Api.ConferencesController System.Collections.Generic.IEnumerable 1 [MeineApp.Models.Konferenz]   GetCurrent () beim Typ MyApp.Api.ConferencesController

Dies bedeutet, dass das Framework StartsWith anstelle von Equal verwendet, um eine Standardaktion zu bestimmen. Außerdem ignoriert es das ActionName-Attribut, wenn Verb mit Aktion verglichen wird.

Meine Frage ist, wie kann ich die Standardaktion des Frameworks so anpassen, dass sie exakt dem Verb entspricht, anstatt StartsWith logic zu verwenden? Ein GET-Verb sollte nur mit einer Get () - Aktion übereinstimmen, nicht mit Get (), GetCurrent () GetPast () usw. (insbesondere, wenn das ActionName-Attribut ignoriert wird).

BEARBEITEN Der Einfachheit halber habe ich nur eine meiner Routen oben gezeigt. Ich denke, es kann helfen, wenn ich alle meine Routen zeige, die noch im Entwurf sind. Ich versuche, eine vollständig funktionierende REST-API zu erhalten, während gleichzeitig noch Platz für das Hinzufügen eigener benutzerdefinierter Aktionen bleibt:

%Vor%

UPDATE Es scheint, dass das Hinzufügen von HTTP-Verbbeschränkungen geholfen hat:

%Vor%     
Basem 21.01.2013, 16:00
quelle

1 Antwort

7

BEARBEITEN: Da Sie die Frage stark bearbeitet haben, muss ich die Antwort ändern:

Kurz gesagt: Dies funktioniert mit der Web-API nicht ohne weiteres, da die Aktion standardmäßig ausgelöst wird:

  1. basierend auf dem Aktionsnamen, wenn {action} Teil der Routendaten ist
  2. basiert auf dem HTTP-Verb

Diese beiden Ansätze können jedoch nicht in einem einzigen Controller gemischt werden , sodass Sie keine Aktionen mit beiden Ansätzen von einem einzigen Controller aus ausführen können (was Sie auch tun möchten).

Sie haben drei Möglichkeiten, dies zu beheben:

  1. überarbeiten Sie Ihre Ressourcen, so dass Sie separate für die Aktion-Name-Dispatching und Verb-basierte Dispping (was ist alles andere als ideal)

  2. Registrieren Sie Routen manuell für jede verschachtelte Route. Auf diese Weise werden Sie weiterhin per HTTP-Verb versendet, aber das Routing zeigt eindeutig auf eine bestimmte Aktion hin. Sie könnten etwas wie AttributeRouting (https://github.com/mccalltd/AttributeRouting) verwenden, um dies zu vereinfachen. Der Nachteil ist natürlich, dass Sie am Ende eine Route pro Aktion haben

  3. Implementieren Sie eine neue IActionSelector , mit der Sie sowohl verbsbasierte als auch aktionsnamensbasierte Dispatching in einem einzigen Controller mischen können. Dies ist die "niedrigste" Lösung, aber scheint genau wie etwas, das Sie tun möchten. Ich habe letzte Woche eine Anleitung gepostet - Ссылка

Filip W 21.01.2013, 16:03
quelle