2012-06-18 41 views
6

我試圖輸出正確包裝的JSONP值以供jQuery使用。以適當的格式返回JSONP WCF

我在尋找的輸出是:

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

但ATM它的輸出:

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

顯然這不是正確的JSONP格式,jQuery的請求無法處理響應。

我在C#中OperationContract的是:

[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; 
    } 

我使用JSON.NET,也是System.Web.Script命名空間使用JavaScriptSerializer嘗試。

但是沒有任何工作對我來說,我真正想要做的就是擺脫兩個雙引號。

+0

什麼是WPF得到了與此有關? –

+0

我正在使用WPF環境,所以我想迎合這一點。通常情況下,我最終會得到與ASP相關的答案,它不會幫助 –

回答

11

如果您要提交與jQuery Ajax請求,並要求dataType: "jsonp",jQuery將傳遞一個名稱在請求中的回調函數(例如,/returndata?s=hello&callback=jquery123456789),所以返回一個常數「jsonCallback」不會在這種情況下工作。

此外,在您的問題中,您的操作合同定義返回Stream,而在操作本身,您將返回string - 在那裏出現問題。

你需要做什麼:你有兩個選擇。第一個是讓WCF爲你處理JSONP填充。您的操作需要返回一個帶有「狀態」屬性的數據類型,然後將其返回。您還需要在端點使用的WebHttpBinding上啓用CrossDomainScriptAccessEnabled屬性。您的操作將類似於下面的代碼:

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" }; 
    } 
} 

第二個選項,如果你想自己創建JSONP代碼,將採取在URI的附加參數爲回調函數的名稱,然後使用它當創建你的迴應。您還需要將它作爲Stream返回,以便您不會以字符串的形式獲得響應(這可能是您現在正在進行的操作)。這將是這樣的:

[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)); 
    } 
} 

這jQuery代碼可以用來訪問此服務:

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

感謝你這樣做,這可能是我面臨的問題,並且對Stream DataType錯誤感到抱歉,在我玩代碼時實際上是一個錯誤。今晚我會試試看看會發生什麼。再次感謝 –

+0

很棒!非常感謝,經過10個小時的研究,我終於完成了它。 –

+0

我不明白第一個選項。 WCF如何爲您處理JSONP填充?爲什麼綁定需要'CrossDomainScriptAccessEnabled',但選項2沒有? – xr280xr

1

您需要評估WCF調用的輸出。看到這個fiddle

你從你的WCF調用中得到一個字符串。你基本上需要編譯它然後執行它。

下面是來自小提琴代碼:

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

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

js變量是從WCF調用你的輸出。只要我eval它,它會編譯和執行。

+0

嗨,感謝提示,但我不相信我的問題作爲''jsoncallback({「Status」:「OK」})回答「 '甚至沒有被jQuery所看到 –