Mam usługę WCF, która jest hostowana w usłudze systemu Windows. Klienci korzystający z tej usługi muszą przekazywać identyfikator za każdym razem, gdy wywołują metody usługi (ponieważ ten identyfikator jest ważny dla tego, co powinna zrobić wywoływana metoda). Pomyślałem, że dobrym pomysłem jest umieszczenie tego identyfikatora w informacjach nagłówka WCF.
Jeśli to dobry pomysł, w jaki sposób mogę automatycznie dodać identyfikator do informacji w nagłówku. Innymi słowy, za każdym razem, gdy użytkownik wywołuje metodę WCF, identyfikator musi zostać automatycznie dodany do nagłówka.
AKTUALIZACJA: Klienci korzystający z usługi WCF to zarówno aplikacje systemu Windows, jak i aplikacja Windows Mobile (korzystająca z Compact Framework).
Odpowiedzi:
Zaletą tego jest to, że jest stosowany do każdego połączenia.
Utwórz klasę, która implementuje IClientMessageInspector . W metodzie BeforeSendRequest dodaj niestandardowy nagłówek do wiadomości wychodzącej. Może to wyglądać mniej więcej tak:
Następnie utwórz zachowanie punktu końcowego, które zastosuje inspektora komunikatów do środowiska wykonawczego klienta. Zachowanie można zastosować za pomocą atrybutu lub konfiguracji przy użyciu elementu rozszerzenia zachowania.
Oto wspaniały przykład dodawania nagłówka klienta użytkownika HTTP do wszystkich komunikatów żądań. Używam tego u kilku moich klientów. Możesz również zrobić to samo po stronie usługi, implementując IDispatchMessageInspector .
Czy to właśnie miałeś na myśli?
Aktualizacja: znalazłem tę listę funkcji WCF, które są obsługiwane przez kompaktową strukturę. Uważam, że inspektorzy wiadomości sklasyfikowani jako „Channel Extensibility”, zgodnie z tym postem, są obsługiwani przez zwarty framework.
źródło
OutgoingMessageProperties
są tym, czego potrzebujesz, aby uzyskać dostęp do nagłówków HTTP, a nieOutgoingMessageHeaders
które są nagłówkami SOAP.Dodajesz go do rozmowy za pomocą:
A potem, po stronie serwera, łapiesz go za pomocą:
źródło
OperationContextScope
(iOperationContext
) sąThreadStatic
- odpowiedź Marka Gooda będzie działać bez polegania naThreadStatic
elementach.Jeśli chcesz tylko dodać ten sam nagłówek do wszystkich żądań do usługi, możesz to zrobić bez kodowania!
Po prostu dodaj węzeł nagłówków z wymaganymi nagłówkami pod węzłem punktu końcowego w pliku konfiguracyjnym klienta
źródło
MessageHeader
) - nie nagłówki HTTP.Oto kolejne pomocne rozwiązanie do ręcznego dodawania niestandardowych nagłówków HTTP do żądania WCF klienta przy użyciu
ChannelFactory
serwera proxy. Musiałoby to być zrobione dla każdego żądania, ale wystarczy jako proste demo, jeśli potrzebujesz tylko przetestować jednostkę proxy w ramach przygotowań do platform innych niż .NET.źródło
Jest to podobne do odpowiedzi NimsDotNet, ale pokazuje, jak to zrobić programowo.
Po prostu dodaj nagłówek do wiązania
źródło
źródło
To właśnie zadziałało w moim przypadku, dostosowane z dodawania nagłówków HTTP do wywołań WCF
Po zadeklarowaniu tych klas można dodać nowe zachowanie do klienta WCF w następujący sposób:
źródło
To działa dla mnie
źródło
Wiązania kontekstowe w .NET 3.5 mogą być właśnie tym, czego szukasz. Istnieją trzy gotowe do użycia: BasicHttpContextBinding, NetTcpContextBinding i WSHttpContextBinding. Protokół kontekstowy zasadniczo przekazuje pary klucz-wartość w nagłówku wiadomości. Przeczytaj artykuł Managing State with Durable Services w magazynie MSDN.
źródło
Jeśli dobrze rozumiem twoje wymagania, prosta odpowiedź brzmi: nie możesz.
Dzieje się tak, ponieważ klient usługi WCF może być generowany przez dowolną stronę trzecią korzystającą z Twojej usługi.
JEŚLI masz kontrolę nad klientami usługi, możesz utworzyć podstawową klasę klienta, która doda żądany nagłówek i odziedziczy zachowanie klas roboczych.
źródło
Możesz określić niestandardowe nagłówki w MessageContract .
Możesz również użyć nagłówków <endpoint>, które są przechowywane w pliku konfiguracyjnym i będą kopiowane przez cały czas w nagłówku wszystkich wiadomości wysyłanych przez klienta / usługę. Jest to przydatne do łatwego dodawania statycznego nagłówka.
źródło
MessageHeader
) - nie nagłówki HTTP.Jeśli chcesz dodać niestandardowe nagłówki HTTP do każdego wywołania WCF w sposób obiektowy, nie szukaj dalej.
Podobnie jak w odpowiedzi Marka Gooda i Paulwhita, musimy podklasę
IClientMessageInspector
wstrzyknąć niestandardowe nagłówki HTTP do żądania WCF. Jednak uczyńmy inspektora bardziej ogólnym, akceptując słownik zawierający nagłówki, które chcemy dodać:Podobnie jak w odpowiedzi Marka Gooda i Paulwhita, musimy przejść do podklasy,
IEndpointBehavior
aby wstrzyknąć nasząHttpHeaderMessageInspector
do naszego klienta WCF.Ostatnią częścią potrzebną do zakończenia naszego podejścia obiektowego jest utworzenie podklasy naszego automatycznie generowanego klienta WCF (do wygenerowania klienta WCF użyłem Przewodnika po usługach sieci Web WCF firmy Microsoft ).
W moim przypadku muszę dołączyć klucz API do
x-api-key
nagłówka HTML.Podklasa wykonuje następujące czynności:
EndpointConfiguration
wyliczenie zostało wygenerowane do przekazania do konstruktora - być może Twoja implementacja tego nie będzie)AddHttpHeaderMessageEndpointBehavior
doEndpoint
zachowań klientaWreszcie, użyj swojego klienta!
Wynikowe żądanie HTTP powinno zawierać Twoje nagłówki HTTP i wyglądać mniej więcej tak:
źródło
Trochę późno na imprezę, ale Juval Lowy omawia dokładnie ten scenariusz w swojej książce i związanym z nią ServiceModelEx bibliotece .
Zasadniczo definiuje specjalizacje ClientBase i ChannelFactory, które umożliwiają określenie bezpiecznych dla typu wartości nagłówka. Sugeruję pobranie źródła i sprawdzenie klas HeaderClientBase i HeaderChannelFactory.
Jan
źródło