Obecnie mam program obsługi komunikatów w mojej usłudze interfejsu API sieci Web, która zastępuje „SendAsync” w następujący sposób:
protected override Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
{
//implementation
}
W tym kodzie muszę sprawdzić niestandardową wartość nagłówka żądania o nazwie MyCustomID
. Problem pojawia się, gdy wykonuję następujące czynności:
if (request.Headers.Contains("MyCustomID")) //OK
var id = request.Headers["MyCustomID"]; //build error - not OK
... pojawia się następujący komunikat o błędzie:
Nie można zastosować indeksowania z [] do wyrażenia typu „System.Net.Http.Headers.HttpRequestHeaders”
Jak mogę uzyskać dostęp do pojedynczego niestandardowego nagłówka żądania za pośrednictwem wystąpienia HttpRequestMessage
( Dokumentacja MSDN ) przekazanego do tej zastąpionej metody?
c#
asp.net-web-api
httprequest
atconway
źródło
źródło
request.Headers.Get("MyCustomID");
?Get' on the
typu HttpRequestHeaders. Wyświetlany jest komunikat: „Nie można rozwiązać symbolu„ Pobierz ””.Odpowiedzi:
Spróbuj czegoś takiego:
Istnieje również metoda TryGetValues w nagłówkach, której możesz użyć, jeśli nie zawsze masz gwarancję dostępu do nagłówka.
źródło
var id = request.Headers.GetValues("MyCustomID").FirstOrDefault();
Some-Header: one
a następnieSome-Header: two
w tej samej prośbie. Niektóre języki po cichu odrzucają „jedynkę”, ale to nieprawda. Jest w RFC, ale jestem zbyt leniwy, żeby go teraz znaleźć.Wiersz poniżej,
throws exception
jeśli klucz nie istnieje.Obejść:
Uwzględnij System.Linq;
źródło
Aby rozwinąć odpowiedź Youssefa, napisałem tę metodę w oparciu o obawy Drew dotyczące nieistnienia nagłówka, ponieważ napotkałem taką sytuację podczas testów jednostkowych.
Oto przykład użycia:
Spójrz także na odpowiedź @ doguhan-uluca, aby uzyskać bardziej ogólne rozwiązanie.
źródło
Func
iAction
są ogólnymi konstrukcjami podpisów delegatów wbudowanymi w .NET 3.5 i nowsze. Chętnie omówię konkretne pytania dotyczące metody, ale polecam najpierw poznać te pytania.HttpRequestMessage
jest inicjowana z pustą kolekcją Headers, która nie jest null. Ta funkcja w końcu zwraca wartość domyślną, jeśli żądanie ma wartość null.Utwórz nową metodę - „ Zwraca indywidualną wartość nagłówka HTTP ” i wywołuj tę metodę z wartością klucza za każdym razem, gdy chcesz uzyskać dostęp do wielu wartości klucza z HttpRequestMessage.
źródło
Aby jeszcze bardziej rozwinąć rozwiązanie @ neontapir, oto bardziej ogólne rozwiązanie, które można zastosować w równym stopniu do HttpRequestMessage lub HttpResponseMessage i nie wymaga ręcznie zakodowanych wyrażeń ani funkcji.
Przykładowe użycie:
źródło
GetFirstHeaderValueOrDefault
ma dwa parametry, więc narzeka na brakujące parametry podczas wywoływania jako użycie próbki.var myValue = response.GetFirstHeaderValueOrDefault<int>("MyValue");
Czy czegoś mi brakuje?var myValue = myNameSpace.HttpRequestMessageExtension.GetFirstHeaderValueOrDefault<int>("productID");
otrzymano Nie podano argumentu, który odpowiada wymaganemu parametrowi formalnemu „headerKey” z „HttpRequestMessageExtension.GetFirstHeaderValueOrDefault <T> (HttpRequestMessage, string)”using HttpResponseMessageExtensions
w pliku, którego próbujesz użyć tego rozszerzenia?W przypadku ASP.Net Core istnieje proste rozwiązanie, jeśli chcesz użyć parametru bezpośrednio w metodzie kontrolera: użyj adnotacji [FromHeader].
Dodatkowe informacje: W moim przypadku „myParam” musiało być ciągiem znaków, int zawsze wynosił 0.
źródło
W przypadku ASP.NET można uzyskać nagłówek bezpośrednio z parametru w metodzie kontrolera za pomocą tej prostej biblioteki / pakietu . Zapewnia
[FromHeader]
atrybut, tak jak w ASP.NET Core :). Na przykład:źródło
Rozwiązanie jednoprzewodowe
źródło
request
jestnull
? Jest to również możliwe. A co, jeśliMyCustomID
jest pustym łańcuchem lub nie równa sięfoo
? To zależy od kontekstu, więc ta odpowiedź po prostu opisuje sposób i całą weryfikację i logikę biznesową, które musisz dodać samodzielniewariant nowoczesny :)
źródło