In der Web-API hatte ich eine Klasse mit ähnlicher Struktur:
public class SomeController : ApiController
{
[WebGet(UriTemplate = "{itemSource}/Items")]
public SomeValue GetItems(CustomParam parameter) { ... }
[WebGet(UriTemplate = "{itemSource}/Items/{parent}")]
public SomeValue GetChildItems(CustomParam parameter, SomeObject parent) { ... }
}
Da wir einzelne Methoden abbilden konnten, war es sehr einfach, die richtige Anfrage am richtigen Ort zu erhalten. Für eine ähnliche Klasse, die nur eine einzige GET
Methode, aber auch einen Object
Parameter hatte, habe ich erfolgreich verwendet IActionValueBinder
. In dem oben beschriebenen Fall erhalte ich jedoch den folgenden Fehler:
Multiple actions were found that match the request:
SomeValue GetItems(CustomParam parameter) on type SomeType
SomeValue GetChildItems(CustomParam parameter, SomeObject parent) on type SomeType
Ich versuche, dieses Problem anzugehen, indem ich die ExecuteAsync
Methode überschreibe , ApiController
aber bisher ohne Glück. Irgendwelche Ratschläge zu diesem Thema?
Bearbeiten: Ich habe vergessen zu erwähnen, dass ich jetzt versuche, diesen Code auf der ASP.NET-Web-API zu verschieben, die einen anderen Ansatz für das Routing hat. Die Frage ist, wie der Code auf der ASP.NET-Web-API funktioniert.
quelle
Antworten:
Dies ist der beste Weg, um zusätzliche GET-Methoden und auch die normalen REST-Methoden zu unterstützen. Fügen Sie Ihrer WebApiConfig die folgenden Routen hinzu:
Ich habe diese Lösung mit der folgenden Testklasse überprüft. Ich konnte jede der folgenden Methoden in meinem Controller erfolgreich ausführen:
Ich habe überprüft, ob die folgenden Anforderungen unterstützt werden:
Hinweis: Wenn Ihre zusätzlichen GET-Aktionen nicht mit 'Get' beginnen, möchten Sie der Methode möglicherweise ein HttpGet-Attribut hinzufügen.
quelle
constraints: new{id=@"\d+"}
routes.MapHttpRoute("DefaultApiPut", "Api/{controller}", new {action = "Put"}, new {httpMethod = new HttpMethodConstraint(HttpMethod.Put)});
für meinePut
Methode hinzufügen , sonst gab es mir 404.Gehen Sie von diesem:
Dazu:
Daher können Sie jetzt angeben, an welche Aktion (Methode) Sie Ihre HTTP-Anfrage senden möchten.
Das Posten in "http: // localhost: 8383 / api / Command / PostCreateUser" ruft Folgendes auf:
und das Posten in "http: // localhost: 8383 / api / Command / PostMakeBooking" ruft Folgendes auf:
Ich habe dies in einer selbst gehosteten WEB API-Dienstanwendung versucht und es funktioniert wie ein Zauber :)
quelle
[HttpGet]
,[HttpPost]
usw. schreibt das Verb dem Verfahren abzubilden.Ich finde Attribute sauberer zu verwenden, als sie manuell über Code hinzuzufügen. Hier ist ein einfaches Beispiel.
Sie benötigen dies auch in Ihrer Webapiconfig
Einige gute Links http://www.asp.net/web-api/overview/getting-started-with-aspnet-web-api/tutorial-your-first-web-api Hier wird das Routing besser erklärt. http://www.asp.net/web-api/overview/web-api-routing-and-actions/routing-in-aspnet-web-api
quelle
config.MapHttpAttributeRoutes();
meineWebApiConfig.cs
undGlobalConfiguration.Configuration.EnsureInitialized();
am Ende meinerWebApiApplication.Application_Start()
Methode hinzufügen , damit die Routenattribute funktionieren.config.MapHttpAttributeRoutes();
muss vor der Routenkartierung erscheinen (zB vorherconfig.Routes.MappHttpRoute(...
.Sie müssen weitere Routen in global.asax.cs wie folgt definieren:
quelle
Mit der neueren Web-API 2 ist es einfacher geworden, mehrere Get-Methoden zu haben.
Wenn die an die
GET
Methoden übergebenen Parameter so unterschiedlich sind, dass das Attribut-Routing-System ihre Typen unterscheiden kann, wie dies beiint
s undGuid
s der Fall ist , können Sie den erwarteten Typ im[Route...]
Attribut angebenZum Beispiel -
Weitere Informationen zu diesem Ansatz finden Sie hier http://nodogmablog.bryanhogan.net/2017/02/web-api-2-controller-with-multiple-get-methods-part-2/
Eine andere Möglichkeit besteht darin, den
GET
Methoden unterschiedliche Routen zuzuweisen.Weitere Informationen finden Sie hier - http://nodogmablog.bryanhogan.net/2016/10/web-api-2-controller-with-multiple-get-methods/
quelle
In ASP.NET 2.0 Core können Sie hinzufügen Routen Attribut an die Steuerung:
quelle
Ich habe versucht, Web Api 2-Attributrouting zu verwenden, um mehrere Get-Methoden zuzulassen, und ich hatte die hilfreichen Vorschläge aus früheren Antworten aufgenommen, aber im Controller hatte ich nur die "spezielle" Methode (Beispiel) dekoriert:
... ohne auch ein [RoutePrefix] oben auf dem Controller zu platzieren:
Ich habe Fehler erhalten, die besagen, dass keine Route gefunden wurde, die mit der übermittelten URI übereinstimmt. Nachdem ich sowohl die [Route] als auch die [RoutePrefix] als Dekoration für den Controller als Ganzes hatte, funktionierte es.
quelle
Ich bin nicht sicher, ob Sie die Antwort gefunden haben, aber ich habe dies getan und es funktioniert
Jetzt in global.asx
quelle
Haben Sie versucht, auf WebInvokeAttribute umzuschalten und die Methode auf "GET" zu setzen?
Ich glaube, ich hatte ein ähnliches Problem und wechselte zu der expliziten Aussage, welche Methode (GET / PUT / POST / DELETE) für die meisten, wenn nicht alle meiner Methoden erwartet wird.
Das WebGet sollte damit umgehen, aber ich habe gesehen, dass es einige Probleme mit mehreren Get viel weniger multiplen Get vom gleichen Rückgabetyp hat.
[Bearbeiten: Nichts davon ist gültig mit dem Sonnenuntergang von WCF WebAPI und der Migration zu ASP.Net WebAPI auf dem MVC-Stapel]
quelle
quelle
Die faule / eilige Alternative (Dotnet Core 2.2):
Ich nenne sie:
"hallo42"
"world99"
quelle
Keines der oben genannten Beispiele entsprach meinen persönlichen Bedürfnissen. Das Folgende ist, was ich letztendlich getan habe.
Um das oben Genannte in Ihrer Route zu verwenden, verwenden Sie:
Was passiert, ist die Art von Fälschungen in der Methode, sodass diese Route nur mit den Standardmethoden GET, POST, PUT und DELETE übereinstimmt. Das "wahre" dort besagt, dass wir nach einer Übereinstimmung der Elemente im Array suchen möchten. Wenn es falsch wäre, würden Sie sagen, schließen Sie diejenigen in der strYou aus. Sie können dann Routen über dieser Standardmethode verwenden, wie:
Oben wird im Wesentlichen nach der folgenden URL gesucht =>
http://www.domain.com/Account/Status/Active
oder so ähnlich.Darüber hinaus bin ich mir nicht sicher, ob ich zu verrückt werden würde. Am Ende des Tages sollte es pro Ressource sein. Ich sehe jedoch aus verschiedenen Gründen die Notwendigkeit, freundliche URLs zuzuordnen. Ich bin mir ziemlich sicher, dass es eine Art Bereitstellung geben wird, wenn sich Web Api weiterentwickelt. Wenn es Zeit ist, werde ich eine dauerhaftere Lösung erstellen und posten.
quelle
new System.Web.Http.Routing.HttpMethodConstraint(HttpMethod.Get, HttpMethod.Post, HttpMethod.Put, HttpMethod.Delete)
stattdessen verwenden.Ich konnte keine der oben genannten Routing-Lösungen zum Laufen bringen - ein Teil der Syntax scheint sich geändert zu haben und ich bin noch neu in MVC -, obwohl ich diesen wirklich schrecklichen (und einfachen) Hack zusammengestellt habe, der mich dazu bringen wird Beachten Sie, dass dies die Methode "public MyObject GetMyObjects (long id)" ersetzt. Wir ändern den Typ "id" in eine Zeichenfolge und den Rückgabetyp in object.
quelle
Wenn Sie mehrere Aktionen in derselben Datei haben, übergeben Sie dasselbe Argument, z. B. ID, an alle Aktionen. Dies liegt daran, dass die Aktion nur die ID identifizieren kann. Anstatt dem Argument einen Namen zu geben, deklarieren Sie nur die ID wie folgt.
quelle
Einfache Alternative
Verwenden Sie einfach eine Abfragezeichenfolge.
Routing
Regler
Anfragen
Hinweis
Beachten Sie, dass der Parameter für die Abfragezeichenfolge nicht "id" sein sollte oder was auch immer der Parameter in der konfigurierten Route ist.
quelle
Ändern Sie die WebApiConfig und fügen Sie am Ende eine weitere Routes.MapHttpRoute wie folgt hinzu:
Erstellen Sie dann einen Controller wie folgt:
So habe ich es gelöst. Ich hoffe es wird jemandem helfen.
quelle