2011-11-21 19 views
6

Tôi có một một dịch vụ hiện có như các phương pháp dưới đây:Làm thế nào để tự nhiên bật JSONP cho dịch vụ WCF hiện có?

[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)] 
[ServiceBehavior(AddressFilterMode = AddressFilterMode.Any)] 
public class SomeService : ISomething 
{ 
    public SomeListResults SomeList(SomeParams someParams) 
    { 
      .... 
    } 
} 

Có một cách đơn giản để cho phép các cuộc gọi JSONP và cũng JSON cùng một lúc (phát hiện nó). Bản địa này có phải không?

Trả lời

9

Cập nhật cấu hình của bạn trông giống như:

<configuration> 
    <system.web> 
    <compilation debug="true" targetframework="4.0"> 
    <authentication mode="None"> 
    </authentication></compilation></system.web> 
    <system.webserver> 
    <modules runallmanagedmodulesforallrequests="true"> 
    </modules></system.webserver> 
    <system.servicemodel> 
    <servicehostingenvironment **aspnetcompatibilityenabled**="true"> 
    <standardendpoints> 
     <webscriptendpoint> 
     <standardendpoint **crossdomainscriptaccessenabled**="true" name=""> 
     </standardendpoint></webscriptendpoint> 
    </standardendpoints> 
    </servicehostingenvironment></system.servicemodel> 
</configuration> 

See here for a blog post cung cấp một hướng của việc tạo ra một dịch vụ WCF mà có thể truy cập cross-domain.

Điều này sẽ cho phép dịch vụ của bạn chấp nhận yêu cầu từ các nguồn đa miền.

Về việc xác định liệu để pad phản ứng của bạn (p trong jsonp),

Nhờ @carlosfigueira cho việc này:

Nếu sử dụng Net 4 JSONP được hỗ trợ natively. Miễn là yêu cầu có tham số chuỗi truy vấn được gọi là "callback" (tên này có thể được định cấu hình), phản hồi sẽ được đệm bằng tên hàm .

Nếu không, bạn sẽ cần phải viết trình kiểm tra tin nhắn tùy chỉnh để đánh dấu phản hồi phù hợp.

+1

Bạn không cần phải viết một thanh tra tùy chỉnh - trong .NET 4.0 JSONP được hỗ trợ natively. Miễn là yêu cầu có tham số chuỗi truy vấn được gọi là "callback" (tên này có thể được định cấu hình), phản hồi sẽ được đệm bằng tên hàm (cho rằng crossDomainScriptAccessEnabled được đặt thành true, như bạn đã đề cập) – carlosfigueira

+0

@carlosfigueira Cảm ơn rất nhiều điều này nugget thông tin, cuối cùng của tôi đột nhập vào thế giới của jsonp và WCF được in .Net 3.5. Trả lời ngay bây giờ đã được cập nhật. Blog tuyệt vời bằng cách này! –

2

Tính năng JSONP mới được hiển thị qua WebHttpBinding. Cấu hình cho CustomersService sẽ trông như thế này:

<bindings> 
    <webHttpBinding> 
     <binding name="webHttpBindingWithJsonP" crossDomainScriptAccessEnabled="true" /> 
    </webHttpBinding> 
    </bindings> 
    <services> 
    <service name="ServiceSite.CustomersService"> 
     <endpoint address="" binding="webHttpBinding" 
       bindingConfiguration="webHttpBindingWithJsonP" contract="ServiceSite.CustomersService" 
       behaviorConfiguration="webHttpBehavior"/> 
    </service> 
    </services> 

Tiêu thụ JSONP với jQuery

// Get the JsonP data 
$.getJSON('http://localhost:65025/CustomersService.svc/GetCustomers?callback=?', null, function (customers) { 
     alert('Received ' + customers.length + ' Customers'); 
}); 
Các vấn đề liên quan