2012-12-22 16 views
6

Mam usługę danych WCF (wersja 5.2), która zastępuje OnStartProcessingRequest(ProcessRequestArgs args). Chcę dodać kilka nagłówków do odpowiedzi (w tej metodzie, którą zakładam, jest właściwe miejsce?). Najpierw wypróbowałem to:HttpContext kontra OperationContext w DataService z nagłówkami HTTP

args.OperationContext.ResponseHeaders.Add(...) 

To nie zadziałało. Następnie wypróbowałem to:

OperationContext.Current.OutgoingMessageHeaders.Add(...) 

To nie zadziałało. Próbowałem dodać nowy OperationContextScope na tym frajerze. Nadal nie udało się. W końcu próbowałem tego:

HttpContext.Current.Response.AddHeader(...); 

Ta opcja zadziałała! (Przez "pracę" mam na myśli to, że faktycznie pojawił się w odpowiedzi na klienta). Dlaczego pierwsze dwie opcje nie zadziałały?

Po przeczytaniu dalej w internecie odkryłem, że

WebOperationContext.Current.OutgoingResponse.Headers.Add(...) 

również działa. Dlaczego na ziemi mamy cztery bieżące konteksty w tej metodzie? W jaki sposób dana osoba może wiedzieć, której z nich użyć (w czasie wykonywania)? Które z nich są poprawne w moich metodach [WebGet]? Które z nich są poprawne w moich metodach [QueryInterceptor]? Który kontekst ma odpowiednie nagłówki żądań? (Do tej pory używałem args.OperationContext).

Odpowiedz

8

Nie wiem o ProcessRequestArgs.OperationContext.ResponseHeaders, ale myślę, że mogę wyjaśnić, dlaczego OperationContext.Current.OutgoingMessageHeaders nie działa: "nagłówki" istnieją nagłówki SOAP (prawdopodobnie ignorowane dla usług innych niż SOAP), a nie nagłówki HTTP. W dwóch pozostałych przypadkach (HttpContext.Current.Response.AddHeader iWebOperationContext.Current.OutgoingResponse.Headers) zwróć uwagę na nazwy "Http" i "Web" w nazwach, aby wskazać, że robisz coś specyficznego dla HTTP, tj. Dodajesz nagłówki HTTP.

Przy okazji:

  • OperationContext - regularne kontekstowego operacji WCF
  • WebOperationContext - Rozszerzenia REST/HTTP WCF kontekście operacji
  • HttpContext - kompatybilność z ASP.NET hosting model działa tylko podczas korzystania Tryb kompatybilny z ASP.NET (nie w przypadku hostowania własnego itd.), Patrz: http://blogs.msdn.com/b/wenlong/archive/2006/01/23/516041.aspx