Ich habe derzeit einen Nachrichtenhandler in meinem Web-API-Dienst, der 'SendAsync' wie folgt überschreibt:
protected override Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
{
//implementation
}
Innerhalb dieses Codes muss ich einen benutzerdefinierten hinzugefügten Anforderungsheaderwert mit dem Namen überprüfen MyCustomID
. Das Problem ist, wenn ich Folgendes mache:
if (request.Headers.Contains("MyCustomID")) //OK
var id = request.Headers["MyCustomID"]; //build error - not OK
... Ich erhalte folgende Fehlermeldung:
Indizierung mit [] kann nicht auf einen Ausdruck vom Typ 'System.Net.Http.Headers.HttpRequestHeaders' angewendet werden.
Wie kann ich über die an diese überschriebene Methode übergebene Instanz ( MSDN Documentation ) auf einen einzelnen benutzerdefinierten Anforderungsheader zugreifen ?HttpRequestMessage
c#
asp.net-web-api
httprequest
atconway
quelle
quelle
request.Headers.Get("MyCustomID");
?Get' on the
HttpRequestHeaders-Typ. Die Meldung "Symbol 'Get' kann nicht aufgelöst werden" wird ausgegeben.Antworten:
Versuchen Sie so etwas:
Es gibt auch eine TryGetValues-Methode für Header, die Sie verwenden können, wenn nicht immer garantiert ist, dass Sie Zugriff auf den Header haben.
quelle
var id = request.Headers.GetValues("MyCustomID").FirstOrDefault();
Some-Header: one
und dannSome-Header: two
in der gleichen Anfrage haben. Einige Sprachen verwerfen stillschweigend "eins", aber das ist falsch. Es ist im RFC, aber ich bin zu faul, um es jetzt zu finden.Die folgende Zeile,
throws exception
wenn der Schlüssel nicht vorhanden ist.Umgehen:
Include System.Linq;
quelle
Um Youssefs Antwort zu erweitern, schrieb ich diese Methode basierend auf Drews Bedenken bezüglich des nicht vorhandenen Headers, da ich während des Komponententests auf diese Situation stieß.
Hier ist ein Beispiel für die Verwendung:
Schauen Sie sich auch die Antwort von @ doguhan-uluca an, um eine allgemeinere Lösung zu finden.
quelle
Func
undAction
sind generische Delegatensignaturkonstrukte, die in .NET 3.5 und höher integriert sind. Ich würde gerne spezifische Fragen zur Methode besprechen, aber ich würde empfehlen, zuerst etwas darüber zu lernen.HttpRequestMessage
recht erinnere, wird eine neue mit einer leeren Headers-Sammlung initialisiert, die nicht null ist. Diese Funktion gibt am Ende den Standardwert zurück, wenn die Anforderung null ist.Erstellen Sie eine neue Methode - ' Gibt einen einzelnen HTTP-Header-Wert zurück ' und rufen Sie diese Methode jedes Mal mit einem Schlüsselwert auf, wenn Sie über HttpRequestMessage auf mehrere Schlüsselwerte zugreifen müssen.
quelle
Um die Lösung von @ neontapir weiter zu erweitern, finden Sie hier eine allgemeinere Lösung, die für HttpRequestMessage oder HttpResponseMessage gleichermaßen gelten kann und keine handcodierten Ausdrücke oder Funktionen erfordert.
Beispielnutzung:
quelle
GetFirstHeaderValueOrDefault
zwei Parameter und beschwert sich über fehlende Parameter beim Aufruf als Beispielverwendung. Fehltvar myValue = response.GetFirstHeaderValueOrDefault<int>("MyValue");
mir etwas?var myValue = myNameSpace.HttpRequestMessageExtension.GetFirstHeaderValueOrDefault<int>("productID");
hätte es kein Argument angegeben ist , dass entspricht den erforderlichen formalen Parameter ‚headerKey‘ von ‚HttpRequestMessageExtension.GetFirstHeaderValueOrDefault <T> (HttpRequestMessage, string)‘using HttpResponseMessageExtensions
in der Datei, dass Sie versuchen, diese Erweiterung zu verwenden?Für ASP.Net Core gibt es eine einfache Lösung, wenn Sie den Parameter direkt in der Controller-Methode verwenden möchten: Verwenden Sie die Annotation [FromHeader].
Zusätzliche Informationen: In meinem Fall musste "myParam" eine Zeichenfolge sein, int war immer 0.
quelle
Für ASP.NET können Sie den Header mithilfe dieser einfachen Bibliothek / dieses Pakets direkt aus dem Parameter in der Controller-Methode abrufen . Es bietet ein
[FromHeader]
Attribut wie in ASP.NET Core :). Beispielsweise:quelle
Einzeilige Lösung
quelle
request
dasnull
? Es ist auch möglich. Oder was ist, wennMyCustomID
eine leere Zeichenfolge gleich ist oder nichtfoo
? Es hängt vom Kontext ab, daher beschreibt diese Antwort nur den Weg und alle Validierungs- und Geschäftslogiken, die Sie selbst hinzufügen müssenmoderne Variante :)
quelle