2012-11-22 29 views
5

Tôi muốn sử dụng thành phần dựa trên ajax (KendoUI) để đọc/sửa đổi các thực thể trên điểm cuối OData do WCF DataServices triển khai.WCF DataService không hỗ trợ các yêu cầu OPTIONS preflight?

Việc thực hiện dịch vụ là khá dễ dàng ở nơi đầu tiên:

public class MyFooService : DataService<FooContext> 
{ 
    public static void SetEntitySetAccessRules(IDataServiceConfiguration config) 
    { 
     config.SetEntitySetAccessRule("Foos", EntitySetRights.AllWrite); 
    } 
} 

Bây giờ tôi đã mong đợi để có thể sửa đổi các đơn vị sử dụng PUT. KendoUI cung cấp một giao diện cấu hình đẹp và dễ dàng và thực hiện tốt công việc tạo yêu cầu PUT.

Chúng tôi đang thực hiện yêu cầu tên miền chéo và sử dụng CORS. Vì vậy, Firefox, ví dụ, gửi một yêu cầu OPTIONS preflight đến dịch vụ OData trước khi gửi PUT.

Rất tiếc, điểm cuối dịch vụ dường như không hỗ trợ OPTIONS out-of-the-box: Phản hồi cho yêu cầu OPTIONS là "501 Không được triển khai" với nội dung trống. Ít nhất chúng ta quản lý mà các phản ứng có các tiêu đề CORS như sau:

<system.webServer> 
    <modules runAllManagedModulesForAllRequests="true" /> 
    <!-- Enable cross-origin resource sharing --> 
    <!-- http://enable-cors.org/#how-asp.net --> 
    <httpProtocol> 
    <customHeaders> 
     <add name="Access-Control-Allow-Origin" value="*" /> 
     <add name="Access-Control-Allow-Methods" value="POST, PUT, DELETE, GET, OPTIONS" /> 
     <add name="Access-Control-Allow-Headers" value="content-Type, accept, origin, X-Requested-With" /> 
     <add name="Access-Control-Allow-Credentials" value="true" /> 
    </customHeaders> 
    </httpProtocol> 
</system.webServer> 

Googling cho điều này đã hóa ra một chút khó khăn vì "lựa chọn" là một thuật ngữ rất phổ biến ...

tôi thấy this article nhưng có vẻ như rất, rất phức tạp. Tôi có nghĩa là, OData là tất cả về REST, tôi không thể tưởng tượng rằng WCF Dịch vụ dữ liệu không cung cấp một cách đơn giản để cho phép yêu cầu preflight, hoặc?

+1

Tôi mang nó rằng WCF OData Dịch vụ hoạt động trên WCF và đi qua cùng một đường ống WCF. Nếu vậy hãy kiểm tra liên kết trong [answer] này (http://stackoverflow.com/questions/11597314/origin-http-localhost-is-not-allowed-by-access-control-allow-origin/11606701#11606701). IMHO là cách dễ nhất để thực hiện CORS trong WCF. – Obaid

+0

Tôi biết điều này không chính xác những gì bạn muốn nhưng tôi nghĩ cách dễ nhất để làm việc với các yêu cầu miền chéo là chỉ sử dụng proxy ngược của IIS. Bằng cách này, bạn chỉ đi ngược lại miền của riêng bạn và IIS là người gửi yêu cầu của bạn đến miền khác. Sau đó, mã của bạn không cần biết bất kỳ điều gì về các miền khác. – lontivero

+0

Ngẫu nhiên tình cờ gặp phải điều này; chỉ nghĩ rằng tôi muốn liên kết với [this] (https://stackoverflow.com/questions/19808069/wcf-dataservice-odata-and-cors) và [rằng] (https://data.uservoice.com/forums/ 72027-wcf-data-services-feature-suggestions/đề xuất/4450449-cors-hỗ trợ) để thảo luận thêm. – tne

Trả lời

1

Hiện tại, WCF DataServices không hỗ trợ CORS, và mọi giải pháp tôi đã thấy đều là hack và hoạt động tốt nhất.

Tôi đã gặp sự cố tương tự và tôi vừa chuyển mã của tôi từ WCF sang giải pháp API Web API 2 OData. Web API 2 có hỗ trợ cho CORS và rất dễ cài đặt.

Nếu bạn đã quen thuộc với Web API, hãy kiểm tra liên kết này: http://msdn.microsoft.com/en-us/magazine/dn532203.aspx

Và đây là một hướng dẫn về làm thế nào để tạo ra một thiết bị đầu cuối OData với Web API: http://www.asp.net/web-api/overview/odata-support-in-aspnet-web-api/odata-v3/creating-an-odata-endpoint

+0

Cảm ơn bạn. Mặc dù câu trả lời là muộn (tôi giải quyết vấn đề bằng cách chuyển sang WebAPI, quá :-)) - đây sẽ là một câu trả lời hữu ích cho bất kỳ độc giả trong tương lai như xa như tôi có thể nói. – chiccodoro

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