2012-12-22 27 views
6

Tôi có WCF DataService (v5.2) ghi đè OnStartProcessingRequest(ProcessRequestArgs args). Tôi muốn thêm một số tiêu đề để trả lời (trong phương pháp này mà tôi giả định là đúng nơi?). Lần đầu tiên tôi thử điều này:HttpContext vs. OperationContext trong DataService với tiêu đề HTTP

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

Điều đó không hiệu quả. Sau đó tôi đã thử điều này:

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

Điều đó không hiệu quả. Tôi đã thử thêm một OperationContextScope mới trên sucker đó. Nó vẫn thất bại. Cuối cùng tôi đã thử điều này:

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

Tùy chọn đó đã hoạt động! (Bởi "công việc" tôi có nghĩa là nó thực sự xuất hiện trong phản ứng với khách hàng.) Tại sao hai tùy chọn đầu tiên không hoạt động?

Sau khi đọc thêm trên web tôi phát hiện ra rằng

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

cũng làm việc. Tại sao chúng ta có bốn ngữ cảnh hiện tại bên trong phương pháp này? Làm thế nào là một người để biết cái nào để sử dụng (trong thời gian chạy)? Cái nào hợp lệ trong các phương thức [WebGet] của tôi? Cái nào hợp lệ trong các phương thức [QueryInterceptor] của tôi? Ngữ cảnh nào được đảm bảo để có các tiêu đề yêu cầu phù hợp? (Tôi đã sử dụng args.OperationContext cho rằng hiện nay.)

Trả lời

8

Không biết về ProcessRequestArgs.OperationContext.ResponseHeaders, nhưng tôi nghĩ rằng tôi có thể giải thích tại sao OperationContext.Current.OutgoingMessageHeaders không hoạt động: các "tiêu đề" có các tiêu đề SOAP (có lẽ được bỏ qua cho các dịch vụ không SOAP), không phải là các tiêu đề HTTP. Trong hai trường hợp còn lại (HttpContext.Current.Response.AddHeader vàWebOperationContext.Current.OutgoingResponse.Headers) hãy chú ý đến "Http" và "Web" trong tên để chỉ ra rằng bạn đang làm một cái gì đó HTTP cụ thể, tức là thêm tiêu đề HTTP.

Bằng cách này:

  • OperationContext - thường xuyên WCF bối cảnh hoạt động
  • WebOperationContext - phần mở rộng REST/HTTP cho WCF bối cảnh hoạt động
  • HttpContext - khả năng tương thích với ASP.NET lưu trữ mô hình, chỉ hoạt động khi sử dụng Chế độ tương thích ASP.NET (không phải khi tự lưu trữ, v.v.), xem http://blogs.msdn.com/b/wenlong/archive/2006/01/23/516041.aspx