2013-01-10 152 views
0

我正在嘗試使用jQuery + Ajax調用自制的vb.net Web服務,並且我正在努力解決具體問題。從jQuery + Ajax調用.Net Web服務

這裏是公開爲Web方法一個小功能:

<WebMethod()> <ScriptMethod(ResponseFormat:=ResponseFormat.Xml, UseHttpGet:=True)> _ 
Public Function GetAllVotes() As XmlDocument 

    Dim theVotes = getVotes() 
    Dim strResult As String = theVotes.XMLSerialize 


    Dim doc As XmlDocument = New XmlDocument() 
    doc.LoadXml(strResult) 
    Return doc 

End Function 

看網頁我已經添加了ScriptMethod屬性,因爲我是返回的XML,但隨時告訴我,如果我不需要它們後就是這樣。

然後,在客戶端,這是代碼:

function getVotes() { 
$.support.cors = true; 

$.ajax({ 
    type: "GET", 
    contentType: "application/json", 
    url: "http://nhrd635:8008/votingmanager.asmx/GetAllVotes", 
    data: {}, 
    dataType: "xml text jsonp", 
    success: function(msg) { 
     // Hide the fake progress indicator graphic. 
     // Insert the returned HTML into the <div>. 
     $('#myPlaceHolder').html(msg); 
    }, 
    error: function(msg) { 
     $('#myPlaceHolder').html(msg); 
     // alert(msg); 
    } 

}); 
} 

我試過這段代碼的很多..許多變化,利用職務或獲得,改變內容類型,有無字符集= UTF-8。有和沒有雙引號的數據:{}。

我使用螢火蟲跟蹤輸出我的要求。只有當我將dataType設置爲jsonp時,我是否會得到結果,但是在所有情況下,代碼都以「error」函數結束,即使狀態爲200 OK。但我知道把它設置爲jsonp是錯誤的,因爲這使得我的xml被視爲實際的javascript ...

我已經閱讀了非常有用的博客條目,從一個傢伙在encosia上。 (樣本:http://encosia.com/3-mistakes-to-avoid-when-using-jquery-with-aspnet-ajax/

但即使他的例子,我無法得到正確的回報。

我在做什麼錯誤,這是非常明顯的?這是事實,我返回一個XML字符串,而不是一個JSON序列化的字符串?

回答

-1

我認爲這裏的大部分問題可能源於交叉源請求(即使在同一臺計算機上跨不同端口發出請求)。這就是爲什麼當你切換到JSONP時,你能夠獲得一絲工作。不幸的是,ASMX「ScriptServices」不支持JSONP,因此WebMethod返回的數據不會成爲jQuery注入的JSONP回調函數的有效參數。

如果可能的話,最好的解決方案是讓服務與調用它的頁面在同一個域上運行。跨源問題有各種解決方案,但它們中的任何一個都不像向發出請求的頁面所在的相同域的簡單XHR請求那樣廣泛兼容/可靠。

如果您不能這樣做,請考慮爲投放votingmanager.asmx的網站啓用CORS支持。這在IE的大多數版本中不起作用,但會在其他瀏覽器中允許跨源請求。有關如何在此處執行此操作的更多信息:http://encosia.com/using-cors-to-access-asp-net-services-across-domains/

切線方向,如果可能,我會避免多餘的XML序列化層。如果getVotes()返回類似於List的東西,則將其用作返回類型,並讓ASP.NET自動將集合序列化爲JSON,然後jQuery將自動將其轉換爲您的成功處理程序中的JavaScript數組。關於這方面的更多信息:http://encosia.com/asp-net-web-services-mistake-manual-json-serialization/

+0

OK,這是有道理的,可惜的是這個腳本有運作跨域。簡而言之,我試圖在我們的網站上重新創建SharePoint 2010的投票功能,該功能的投票功能由好管理員禁用....所以我們想通過創建一個可以通過sharepoint web運行的WS來創建我們自己的投票功能服務。無論如何,就像我提到的那樣,當使用jsonp數據類型時,firebug會看到一個響應。即使它落在「錯誤」處理程序中,是否有可能從錯誤處理程序中讀取jquery的響應,然後以某種方式破壞我的方式重新投射它/重新將其轉換回html? – Stephane

+0

@Stephane:如果您不控制遠程服務器,則另一種選擇是在本地服務器上使用HttpHandler作爲不違反同源策略的中繼:http://encosia.com/use -asp-nets-httphandler-to-bridge-the-cross-domain-gap/ –

+0

再次,有趣的是,你似乎在最近幾乎所有問題上都發表了博文......在意識到不可能獲得ajax響應即使是jsonp形式,我也決定我最簡單的選擇是將我的web服務「轉換」爲一系列小型網頁,我可以通過一個簡單的獲取請求進行調用,但這很醜陋。我不明白你的HttpHandler的所有內容,但看起來很有希望。非常感謝您的幫助,我們非常感謝。 – Stephane

0

隨着Stack Overflow的更多閱讀和Encosia的Dave Ward的幫助,我設法解決了我的問題。我想我應該在這裏發佈我的最終解決方案,以防將來幫助別人。

首先,Web服務是一種不好的方式,我按照Dave Ward在回答我原來的問題時提出的HttpHandler solution

返回XML也是一個糟糕的選擇,我並沒有真正意識到。我在項目中添加了對JSon.net的引用,並使用它將我的對象轉換爲Json字符串。

我真的很想堅持「.net only」轉換成json字符串,正如Dave's blog post中所建議的那樣,但不知何故,我努力學習如何指示.net自動轉換成Json,就像Dave的例子一樣,所以我花了一個簡單的辦法與Json.net到「搞不定」

然後,在我的HttpHandler的,我有應答串遵循這個帖子上的說明從StackOverflow的:

https://stackoverflow.com/a/3703221/1060133

在我情況,這是:

context.Response.Write(String.Format("{0}({1});", context.Request("callback"), jsonVotes)) 

jquery調用還使用了上述文章中的說明。

有趣的注意,甚至在無參數的通話,你必須發送空的數據,像這樣:

$.getJSON('http://url/httpHandler.ashx?callback=?', {}, 
      function(data) { 
      alert(data); 
      } 
); 

祝你好運......

+0

很高興你能工作。如果您原樣使用我的HttpHandler解決方案,那麼您無法自動將JSON從服務中自動取出的原因是因爲HttpHandler會一直通過GET來請求它,而不是添加application/json Content-Type。除非滿足這兩個條件,否則「ScriptServices」不會返回JSON。 –