2012-06-18 23 views
6

Tôi đang cố gắng xuất một giá trị JSONP được bọc chính xác cho jQuery để tiêu thụ.Trả lại JSONP ở định dạng thích hợp WCF

Sản lượng tôi đang tìm kiếm là:

jsoncallback({"Status": "OK"}) 

Nhưng atm nó xuất ra:

"jsoncallback({"Status": "OK"})" 

Rõ ràng đây không phải là ở định dạng JSONP đúng như yêu cầu jQuery không thể xử lý phản ứng.

OperationContract My trong C# là:

[OperationContract] 
[WebInvoke(Method = "GET", 
    ResponseFormat = WebMessageFormat.Json, 
    UriTemplate = "returndata?s={s}")] 
Stream EchoWithGet(string s); 

    public string EchoWithGet(string s) 
    { 
     string json = @"jsoncallback({'Status':'OK'})"; 
     Console.WriteLine("Call Made: " + s); 
     return json; 
    } 

Tôi đã cố gắng sử dụng JSON.NET và cũng là System.Web.Script Namespace để sử dụng JavaScriptSerializer.

Nhưng không có gì làm việc cho tôi tất cả những gì tôi thực sự muốn làm là loại bỏ hai dấu ngoặc kép.

+0

gì WPF đã làm với điều này? –

+0

Tôi đang sử dụng môi trường WPF, vì vậy tôi muốn phục vụ cho điều đó.Thông thường tôi sẽ nhận được câu trả lời liên quan đến ASP, nơi nó sẽ không giúp đỡ –

Trả lời

11

Nếu bạn đang gửi yêu cầu ajax với jQuery và yêu cầu dataType: "jsonp", jQuery sẽ chuyển tên cho hàm gọi lại trong yêu cầu (ví dụ: /returndata?s=hello&callback=jquery123456789), vì vậy trả về hằng số "jsonCallback" sẽ không hoạt động trong trường hợp đó .

Ngoài ra, trong câu hỏi của bạn, bạn có định nghĩa hợp đồng hoạt động trở về Stream, trong khi chính bản thân bạn đang quay trở lại string - có sự cố ở đó.

Điều bạn cần làm: bạn có hai tùy chọn. Điều đầu tiên là để WCF xử lý lớp đệm JSONP cho bạn. Hoạt động của bạn sẽ cần trả về kiểu dữ liệu với thuộc tính "Trạng thái" và chỉ trả lại. Bạn cũng cần bật thuộc tính CrossDomainScriptAccessEnabled trên WebHttpBinding được sử dụng bởi điểm cuối của bạn. hoạt động của bạn sẽ trông giống như mã bên dưới:

public class MyType 
{ 
    public string Status { get; set; } 
} 

[ServiceContract] 
public class Service 
{ 
    [WebGet(UriTemplate = "returndata?s={s}")] 
    public MyType ReturnData(string s) 
    { 
     return new MyType { Status = "OK" }; 
    } 
} 

Lựa chọn thứ hai, nếu bạn muốn tạo mã JSONP mình, sẽ là để có một tham số bổ sung trong URI cho tên hàm callback, sau đó sử dụng nó khi tạo câu trả lời của bạn. Bạn cũng cần phải trả lại số này là Stream, để bạn không nhận được phản hồi dưới dạng chuỗi (có thể là những gì bạn có ngay bây giờ). Điều đó sẽ trông như thế này:

[ServiceContract] 
public class Service 
{ 
    [WebGet(UriTemplate = "ReturnData?s={s}&callback={callbackFunctionName}")] 
    public Stream EchoWithGet(string s, string callbackFunctionName) 
    { 
     string jsCode = callbackFunctionName + "({\"Status\":\"OK\"});"; 
     WebOperationContext.Current.OutgoingResponse.ContentType = "application/javascript"; 
     return new MemoryStream(Encoding.UTF8.GetBytes(jsCode)); 
    } 
} 

Và mã jQuery này có thể được sử dụng để truy cập vào dịch vụ này:

function StackOverflow_11090835_Test() { 
     var url = "/StackOverflow_11090835.svc/ReturnData"; 
     var data = { s: "Hello world" }; 
     $.ajax({ 
      type: 'GET', 
      url: url, 
      data: data, 
      dataType: "jsonp", 
      success: function (result) { 
       $("#result").text(result.Status); 
      } 
     }); 
    } 
+0

Cảm ơn vì điều này, đây có thể là vấn đề tôi đang gặp phải và xin lỗi về lỗi Stream DataType, nó thực sự là một sai lầm khi tôi đang chơi với mã. Tôi sẽ cố gắng tối nay và xem điều gì sẽ xảy ra. Cảm ơn một lần nữa –

+0

Hoạt động tuyệt vời! Cảm ơn rất nhiều, sau 10 giờ nghiên cứu cuối cùng tôi đã xoay sở được. –

+0

Tôi không hiểu tùy chọn đầu tiên. WCF xử lý lớp đệm JSONP cho bạn như thế nào? Và tại sao liên kết yêu cầu 'CrossDomainScriptAccessEnabled' nhưng tùy chọn 2 không? – xr280xr

1

Bạn cần đánh giá đầu ra từ cuộc gọi WCF của mình. Xem này fiddle.

Bạn nhận được một chuỗi từ cuộc gọi WCF của mình. Về cơ bản, bạn cần phải biên dịch nó và sau đó thực hiện nó.

Dưới đây là mã từ fiddle:

function jsonCallback(obj){ 
    alert(obj.Status); 
} 

$(document).ready(function(){ 
    var js = "jsonCallback({'Status':'OK'})"; 
    eval(js); 
});​ 

Biến js là đầu ra của bạn từ các cuộc gọi WCF. Ngay sau khi tôi eval nó, nó sẽ biên dịch và thực hiện.

+0

Hi cảm ơn cho các gợi ý nhưng tôi không tin rằng câu trả lời câu hỏi của tôi như là "jsoncallback" ({"Status": "OK"}) " 'thậm chí không được xem xét bởi jQuery –

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