Ich konvertiere von der WCF-Web-API in die neue ASP.NET MVC 4-Web-API. Ich habe einen UsersController und möchte eine Methode namens Authenticate. Ich sehe Beispiele für GetAll, GetOne, Post und Delete. Was ist jedoch, wenn ich diesen Diensten zusätzliche Methoden hinzufügen möchte? Zum Beispiel sollte mein UsersService eine Methode namens Authentifizieren haben, bei der er einen Benutzernamen und ein Passwort übergibt, dies funktioniert jedoch nicht.
public class UsersController : BaseApiController
{
public string GetAll()
{
return "getall!";
}
public string Get(int id)
{
return "get 1! " + id;
}
public User GetAuthenticate(string userName, string password, string applicationName)
{
LogWriter.Write(String.Format("Received authenticate request for username {0} and password {1} and application {2}",
userName, password, applicationName));
//check if valid leapfrog login.
var decodedUsername = userName.Replace("%40", "@");
var encodedPassword = password.Length > 0 ? Utility.HashString(password) : String.Empty;
var leapFrogUsers = LeapFrogUserData.FindAll(decodedUsername, encodedPassword);
if (leapFrogUsers.Count > 0)
{
return new User
{
Id = (uint)leapFrogUsers[0].Id,
Guid = leapFrogUsers[0].Guid
};
}
else
throw new HttpResponseException("Invalid login credentials");
}
}
Ich kann zu myapi / api / users / navigieren und es wird GetAll aufrufen und ich kann zu myapi / api / users / 1 navigieren und es wird Get aufrufen. Wenn ich jedoch myapi / api / users / authenticate aufrufe? Username = {0} & password = {1}, dann wird Get (NOT Authenticate) und error aufgerufen:
Das Parameterwörterbuch enthält einen Nulleintrag für den Parameter 'id' vom nicht nullbaren Typ 'System.Int32' für die Methode 'System.String Get (Int32)' in 'Navtrak.Services.WCF.NavtrakAPI.Controllers.UsersController'. Ein optionaler Parameter muss ein Referenztyp oder ein nullbarer Typ sein oder als optionaler Parameter deklariert werden.
Wie kann ich benutzerdefinierte Methodennamen wie Authentifizieren aufrufen?
Antworten:
Standardmäßig folgt die Routenkonfiguration den RESTFul-Konventionen, dh, sie akzeptiert nur die Aktionsnamen Get, Post, Put und Delete (siehe Route in global.asax => Standardmäßig können Sie keinen Aktionsnamen angeben => es verwendet das HTTP-Verb zum Versenden). Wenn Sie also eine GET-Anforderung an Sie senden,
/api/users/authenticate
rufen Sie im Grunde dieGet(int id)
Aktion auf und übergeben sie,id=authenticate
was offensichtlich abstürzt, weil Ihre Get-Aktion eine Ganzzahl erwartet.Wenn Sie andere Aktionsnamen als die Standardnamen haben möchten, können Sie Ihre Routendefinition ändern in
global.asax
:Jetzt können Sie zu navigieren,
/api/values/getauthenticate
um den Benutzer zu authentifizieren.quelle
{action}
dass dies eine Einschränkung darstellt,{id}
sodass alles andere alsint
oderGuid
(oder was auch immer) nicht übereinstimmt. Dann sollte es in der Lage sein, zu dem von DarinDies ist die beste Methode, die ich bisher entwickelt habe, um zusätzliche GET-Methoden zu integrieren und gleichzeitig 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
put
unddelete
verben so konfiguriere wie du es getan hastget
undpost
auch gut funktioniert?put
oderdelete
Verben konfigurieren möchten oder müssen, da diese Anforderungen normalerweise einen ID-Parameter begleiten, um die Ressource zu identifizieren, auf die Sie diese Operation anwenden möchten. Eindelete
Aufruf von/api/foo
sollte einen Fehler auslösen, denn welches Foo möchten Sie löschen? Daher sollte die DefaultApiWithId-Route diese Fälle problemlos behandeln.Ich bin Tage in der MVC4-Welt.
Für was es wert ist, habe ich einen SitesAPIController, und ich brauchte eine benutzerdefinierte Methode, die wie folgt aufgerufen werden könnte:
Mit unterschiedlichen Werten für den letzten Parameter, der mit unterschiedlichen Dispositionen aufgezeichnet werden soll.
Was schließlich für mich funktioniert hat war:
Die Methode im SitesAPIController:
Und das in der WebApiConfig.cs
Solange ich die {Disposition} als {id} nannte, begegnete ich:
Als ich es in {disposition} umbenannte, fing es an zu funktionieren. Anscheinend stimmt der Parametername also mit dem Wert im Platzhalter überein.
Fühlen Sie sich frei, diese Antwort zu bearbeiten, um sie genauer / erklärender zu machen.
quelle
Web-API erwartet standardmäßig, dass eine URL in Form von API / {Controller} / {ID} dieses Standard-Routing überschreibt. Sie können das Routing auf zwei Arten einstellen.
Erste Wahl:
Fügen Sie unten die Routenregistrierung in WebApiConfig.cs hinzu
Dekorieren Sie Ihre Aktionsmethode mit HttpGet und den folgenden Parametern
Für den Aufruf der obigen Methode lautet die URL wie unten
http: // localhost: [yourport] / api / MyData / ReadMyData? param1 = value1 & param2 = value2 & param3 = value3
Zweite Option Fügen Sie der Controller-Klasse ein Routenpräfix hinzu und dekorieren Sie Ihre Aktionsmethode mit HttpGet wie folgt. In diesem Fall müssen Sie keine WebApiConfig.cs ändern. Es kann Standardrouting haben.
Für den Aufruf der obigen Methode lautet die URL wie unten
http: // localhost: [yourport] / api / MyData / ReadMyData? param1 = value1 & param2 = value2 & param3 = value3
quelle
Wenn Sie ASP.NET 5 mit ASP.NET MVC 6 verwenden , funktionieren die meisten dieser Antworten einfach nicht, da MVC normalerweise die entsprechende Routensammlung für Sie erstellen lässt (unter Verwendung der Standardkonventionen von RESTful) Sie werden keinen
Routes.MapRoute()
Anruf zum Bearbeiten nach Belieben finden.Die
ConfigureServices()
von derStartup.cs
Datei aufgerufene Methode registriert MVC beim in ASP.NET 5 integrierten Dependency Injection-Framework. Wenn SieApplicationBuilder.UseMvc()
später in dieser Klasse aufrufen , fügt das MVC-Framework diese Standardrouten automatisch zu Ihrer App hinzu. Wir können einen Blick darauf werfen, was hinter der Haube passiert, indem wir uns dieUseMvc()
Methodenimplementierung im Framework-Quellcode ansehen :Das Gute daran ist, dass das Framework jetzt die gesamte harte Arbeit erledigt, alle Aktionen des Controllers durchläuft und deren Standardrouten einrichtet, wodurch Sie überflüssige Arbeit sparen.
Das Schlimme ist, dass es wenig oder keine Dokumentation darüber gibt, wie Sie Ihre eigenen Routen hinzufügen können. Glücklicherweise können Sie dies problemlos tun, indem Sie entweder einen konventionellen und / oder einen attributbasierten Ansatz (auch bekannt als Attribut-Routing ) verwenden.
Konventionsbasiert
Ersetzen Sie in Ihrer Startup.cs-Klasse Folgendes:
mit diesem:
Attributbasiert
Eine großartige Sache bei MVC6 ist, dass Sie Routen auch pro Controller definieren können, indem Sie entweder die
Controller
Klasse und / oder dieAction
Methoden mit den entsprechendenRouteAttribute
und / oderHttpGet
/HttpPost
Vorlagenparametern wie den folgenden dekorieren :Dieser Controller verarbeitet die folgenden Anforderungen:
Beachten Sie außerdem, dass bei Verwendung der beiden Ansätze zusammen Attributbasierte Routen (sofern definiert) die auf Konventionen basierenden Routen überschreiben und beide die von definierten Standardrouten überschreiben
UseMvc()
.Für weitere Informationen können Sie auch den folgenden Beitrag in meinem Blog lesen .
quelle
public IActionResult Patch(int id, [FromQuery] Person person)
sind alle eingehenden Eigenschaften null!In diesem Artikel finden Sie eine längere Beschreibung der benannten Aktionen. Es zeigt auch, dass Sie das Attribut [HttpGet] verwenden können, anstatt dem Aktionsnamen "get" voranzustellen.
http://www.asp.net/web-api/overview/web-api-routing-and-actions/routing-in-aspnet-web-api
quelle
Ändern Sie einfach Ihre WebAPIConfig.cs wie folgt
Implementieren Sie dann Ihre API wie folgt
quelle
Web APi 2 und neuere Versionen unterstützen eine neue Art von Routing, das so genannte Attribut-Routing. Wie der Name schon sagt, verwendet das Attribut-Routing Attribute, um Routen zu definieren. Durch das Attribut-Routing haben Sie mehr Kontrolle über die URIs in Ihrer Web-API. Sie können beispielsweise problemlos URIs erstellen, die Hierarchien von Ressourcen beschreiben.
Beispielsweise:
Wird perfekt und Sie benötigen keinen zusätzlichen Code, zum Beispiel in WebApiConfig.cs. Sie müssen nur sicherstellen, dass das Web-API-Routing in WebApiConfig.cs aktiviert ist oder nicht. Andernfalls können Sie Folgendes aktivieren:
Sie müssen in WebApiConfig.cs nichts mehr tun oder etwas ändern. Weitere Informationen finden Sie in diesem Artikel .
quelle