2011-08-29 50 views
19

Tôi có dịch vụ REST WCF được lưu trữ trong dịch vụ Windows và tôi muốn gửi tiêu đề HTTP Access-Control-Allow-Origin HTTP (được định nghĩa là một phần của CORS) với mọi phản hồi.Hỗ trợ CORS trong WCF REST Services

giải pháp cố gắng của tôi là có một cái gì đó như sau trong vòng một thực hiện IDispatchMessageInspector:

public void BeforeSendReply(ref Message reply, object correlationState) 
{ 
    var httpResponse = reply.Properties["httpResponse"] as HttpResponseMessageProperty; 
    if (httpResponse != null) 
    { 
     // test of CORS 
     httpResponse.Headers["Access-Control-Allow-Origin"] = "*"; 
    } 
} 

Thông thường điều này sẽ làm việc, nhưng tiếc là dịch vụ của tôi cũng sử dụng HTTP basic authorization, có nghĩa là khi có một request đến mà không có sự ủy quyền tiêu đề, WCF tự động gửi một phản hồi 401 yêu cầu thông tin đăng nhập. Thật không may WCF không gọi IDispatchMessageInspector của tôi trong lần trao đổi ban đầu này, vì vậy đầu đề Access-Control-Allow-Origin không được thêm vào trao đổi ban đầu.

Sự cố xảy ra khi tôi cố gắng gọi dịch vụ từ trình duyệt. CORS chỉ định rằng yêu cầu có nguồn gốc chéo chỉ được phép nếu miền gốc khớp với tên miền được liệt kê trong tiêu đề phản hồi Access-Control-Allow-Origin (* khớp với tất cả tên miền). Thật không may khi trình duyệt thấy phản hồi 401 ban đầu mà không có tiêu đề Access-Control-Allow-Origin, trình duyệt sẽ ngăn truy cập (theo số same origin policy).

Có cách nào thêm tiêu đề vào phản hồi 401 ban đầu được gửi tự động bởi WCF không?

+0

Bạn đã bao giờ nhận được bất cứ nơi nào với điều này? –

Trả lời

6

Để đạt được những gì bạn muốn, bạn cần tự mình xử lý ủy quyền có thể bằng cách impelementing + đăng ký HttpModule ... ở đó bạn sẽ phát hành 401 và cùng với bất kỳ tiêu đề http nào bạn muốn ... thậm chí có mẫu thực hiện ở đây trên SO - xem Adding basic HTTP auth to a WCF REST service

EDIT - sau khi bình luận từ OP:

Kể từ khi bình luận của OP nói rằng ông là tự lưu trữ các giải pháp là không phải với HTTPModule nhưng thực sự với IDispatchMessageInspector.BeforeSendReply và với IDispatchMessageInspector.AfterReceiveRequest .

Uỷ quyền phải được định cấu hình thành "Không" và được triển khai/xử lý tùy chỉnh trong IDispatchMessageInspector - theo cách này bạn có thể thêm bất kỳ tiêu đề nào khi phát hành 401. Nếu không, thời gian chạy Xử lý Cơ bản Auth sẽ không gọi số IDispatchMessageInspector của bạn trước đúng/tích cực Auth.

Mặc dù điều này làm việc Ghi chú rằng điều này có nghĩa bạn triển khai mã an ninh-sensitiv mình và do đó cần phải thực hiện appriopriate biện pháp để đảm bảo thực hiện đúng của nó ...

+0

Cảm ơn bạn đã trả lời. Dịch vụ của tôi cần phải là một dịch vụ Windows tự lưu trữ, không phải IIS được lưu trữ. Công cụ xác thực cơ bản HTTP trong dịch vụ của tôi hoạt động tốt. CORS cũng hoạt động tốt (giả sử tôi vô hiệu hóa auth cơ bản). Vấn đề chỉ xảy ra khi trộn HTTP cơ bản và CORS trên dịch vụ tự lưu trữ. Nếu tôi đã lưu trữ dịch vụ trong IIS, tôi sẽ cấu hình IIS để gửi các tiêu đề phản hồi CORS trên mọi yêu cầu và sử dụng một HttpModule cho auth cơ bản HTTP. – Kevin

+0

ok - xem chỉnh sửa của tôi ... giải pháp của bạn đã là một nửa ... bạn cần phải thực hiện một phương pháp khác và thay đổi cấu hình ... – Yahia

+0

Đặt clientCredentialType = "None" và thực hiện việc kiểm tra thủ công hầu như hoạt động. Bạn có thể gửi trả lời 401, nhưng WCF không cho phép bạn đặt tiêu đề phản hồi WWW-Authenticate. Cố gắng thiết lập WWW-Authenticate trong mã khiến WCF trả lại 504. Nếu không có WWW-Authenticate, trình duyệt sẽ không nhắc các thông tin xác thực. – Kevin

22

anh chàng này lưu ngày của tôi.

http://blogs.microsoft.co.il/blogs/idof/archive/2011/07.aspx

Tôi sẽ đặt một số ghi chép của mình ở đây, chỉ trong trường hợp trang web đó chết một ngày nào đó. (Tôi ghét việc tìm kiếm "Câu trả lời của bạn là đúng HERE" liên kết, và sau đó liên kết là chết.)

<behaviors> 
    <endpointBehaviors> 
    <behavior name="webSupport"> 
     <webHttp /> 
     <CorsSupport /> 
    </behavior> 
    </endpointBehaviors> 
</behaviors> 
<extensions> 
    <behaviorExtensions> 
    <add name="CorsSupport" type="WebHttpCors.CorsSupportBehaviorElement, WebHttpCors, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" /> 
    </behaviorExtensions> 
</extensions> 
<services> 
    <service name="Service.JSonService"> 
    <endpoint address="http://localhost:8080" behaviorConfiguration="webSupport” binding="webHttpBinding" contract="Service.IJSonService" /> 
    </service> 
</services> 

Bây giờ, bạn phải tìm thư viện tải về của ông được gọi là "WebHttpCors.dll".

Nhưng có đủ ở đó (ở trên) để giúp bạn google/bing theo cách của bạn đến độ phân giải.

Phần đã ném tôi cho một vòng lặp (trong kịch bản của tôi) là IE đang hoạt động, nhưng Firefox không hoạt động.

trang có nguồn gốc của tôi là:

http://localhost:53692/test/WCFCallTestViaJQ14.htm 

Vì vậy, dịch vụ của tôi là:

http://localhost:8002/MyWCFService/MyWCFMethodByWebGet?state=NC&city=Raleigh 

Vì vậy, tôi đã localhost < < - >> giao thông localhost.

**** Nhưng các cổng khác nhau. (53692 và 8002) ****

IE đã đồng ý với nó. Firefox không ổn với nó.

Sau đó, bạn phải nhớ rằng mỗi trình duyệt xử lý yêu cầu .Send() của chúng khác nhau (bên trong JQUERY).

Bây giờ tất cả đều có ý nghĩa.

//JavaScript snipplet 

if (window.XMLHttpRequest) { 

    returnObject = new XMLHttpRequest(); 

} else if (window.ActiveXObject) { 

    returnObject = new ActiveXObject("Microsoft.XMLHTTP"); 

} else { 

msg = "Your browser doesn't support AJAX!"; 

} 

Dưới đây là một số từ khóa, cụm từ tôi đã googling/binging cuối cùng đã dẫn tôi đến một nơi nào đó.

Result: [Exception... "Component returned failure code: 0x80040111 (NS_ERROR_NOT_AVAILABLE) [nsIXMLHttpRequest.statusText]" nsresult: "0x80040111 (NS_ERROR_NOT_AVAILABLE)" location: "JS frame :: http://localhost:53692/test/WCFCallTestViaJQ14.htm :: HandleJQueryError :: line 326" data: no] 


XMLHttpRequest Send "NS_ERROR_FAILURE" 

JQuery Ajax WCF Self Hosted CORS JSON 
+0

Upvote cho tất cả các chi tiết. Giữ cho cuộc chiến tốt chống lại thối liên kết! – codekaizen

Các vấn đề liên quan