2012-05-06 71 views
2

我有一個用C#和WCF編寫的小型webservice。使用C#和WFC的跨域jQuery Ajax

[WebService(Namespace = "http://tempuri.org/")] 
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)] 
[System.Web.Script.Services.ScriptService] 
public class Service1 : System.Web.Services.WebService 
{ 
    [WebMethod] 
    public string HelloWorld() 
    { 
     return "Hello Worlds"; 
    } 
} 

我有一個小小的jQuery代碼;

 $.support.cors = true; 

     $.ajax({ 
      type: "POST", 
      url: "http://localhost:61614/Service1.asmx/HelloWorld", 
      data: '{}', 
      dataType: "json", 
      success: function (msg) { 
       alert(0); 
      }, error: function (a, b, c) { alert("Err:" + c); 
      } 
     }); 

這調用web服務。打電話沒有問題,但在退貨時出錯。

該webservice在一個應用程序,並且該網頁是它自己的簡單的HTML頁面。最終,HTML將在PhoneGap中使用。

我嘗試了各種各樣的東西。

contentType: "application/json; charset=utf-8",中添加會導致整個呼叫失敗。 使用dataType: 'jsonp"會導致呼叫失敗。

基本上,上面調用WS但錯誤返回,這是奇怪的。

我的要求是我需要從web服務返回一個JSON對象,它必須在Safari中工作。

有沒有人有JSONP調用的完整示例代碼?

+0

不知道它是否有幫助http://www.codeproject.com/Articles/186235/Making-a-JSONP-Call-to-a-WCF-Data-Service-using-da –

+0

@griegs - 第一步,請確保http:// localhost:61614/Service1.asmx/HelloWorld?callback = test在您的瀏覽器中返回JavaScript函數,如下所示:'test({'say':'HelloWorld'});'。在你這樣做之前,jsonp請求將不會成功。您可以在地址欄中進行測試。希望這可以幫助。 – jmort253

+0

有一點要澄清。一旦你上線,你是否100%肯定你在域名上提出請求?如果它是相同的域,那麼你可以返回沒有填充/包裝功能的JSON。 – jmort253

回答

0

jQuery getJSON

如果URL中包含字符串 「?回調=」 (或類似的,由服務器端API定義),請求將被視爲JSONP。有關更多詳細信息,請參閱$ .ajax()中關於jsonp數據類型的討論。

爲了您的請求被視爲JSONP請求,您需要在您的URL中包含callback=?。這告訴jQuery創建一個回調函數,並將該函數的名稱作爲回調參數傳遞給您的服務器。

在服務器端代碼中,您的方法必須返回包裝或填充JSON代碼,並將JavaScript函數的名稱作爲查詢字符串中的回調參數傳入。

本質上,你正在做的是將JavaScript返回到客戶端瀏覽器,該瀏覽器立即運行,並調用已經在頁面上下文中定義的函數。

的JavaScript:

$.getJSON("http://localhost:61614/Service1.asmx/HelloWorld?callback=?", 
    function(data) { 

     // alert raw JSON data 
     alert(JSON.stringify(data)); 

     // access the "say" property and alert it 
     alert(data.say); 
    } 
); 

服務器端:

這是你需要在服務器端做粗版本:

// get the callback parameter value and assign to the String callback 
... 
return callback + "({ 'say' : 'HelloWorld' });"; 

進一步的技術解釋引擎蓋下發生了什麼:

儘管這不是您今天需要了解的內容,但這可能會幫助您更多地瞭解jQuery如何實現JSONP。

此評估的東西看起來像這樣的:

return "jquery43214321432143242({'say':'HelloWorld'});" 

其中jquery43214321432143242是你成功的回調函數給出的隨機名稱。同樣,由於返回的文本是使用text/javascript返回的,它會立即運行,將{'say':'HelloWorld'}對象作爲參數傳遞給該函數。

生成的輸出應該是一條代表原始JSON的警報消息,以及從.say屬性中提取的單詞「HelloWorld」。

+0

jmort253,由於某種原因,這仍然沒有調用Web服務。 – griegs

+0

在您的瀏覽器中,http:// localhost:61614/Service1.asmx/HelloWorld?callback = test是否返回test({'say':'HelloWorld'})如果不是,那就是第一步。它基本上是動態生成的文本/ JavaScript。請先嚐試一下。 – jmort253

+0

這是一個更復雜的JSONP示例,但它應該讓您瞭解在瀏覽器中打開URL時需要看到的內容。請注意JSON對象如何包裝在名爲「test」的函數中:http://search.twitter.com/search.json?q=blue%20angels&rpp=5&include_entities=true&result_type=mixed&callback=test – jmort253