2014-04-02 106 views
1

我主持一個Web服務讓跨域Web服務調用未返回預期的結果

http://example1.com/webservice.asmx

,並希望從

http://example2.com

叫我有jQuery的準則像example2.com

GetData: function() { 
    $.ajax({ 
     crossDomain: true, 
     type: "POST", 
     url: "http://example1.com/webservice.asmx/GetData", 
     dataType: "jsonp", 
     contentType: "application/json; charset=utf-8", 
     data: { Date: '' }, 
     success: function (data, textStatus, jqXHR) { 
      debugger;     
     }, 
     error: function (data, textStatus, jqXHR) { 
      alert("data"); 
     } 
    }); 
    } 

it像

http://example1.com/webservice.asmx/GetData?callback=jQuery19106349606812515739_1396429620115&Date=&_=1396429620116 

它使用GET方法(從螢火蟲)擊​​中該網址。實際上哪裏是我無法找到它的問題。它以XML格式響應數據。 並且還以XML格式響應數據但未成功事件。 但它工作正常,如果我把相同的代碼在同一個域。

+1

您的webservice是否包裝響應與回調?例如'jQuery19106349606812515739_1396429620115({'iam':'json response'});'? –

+0

不,我不知道從哪裏jQuery19106349606812515739_1396429620115 被添加到請求服務的URL。 – manoj

+0

你知道dataType:「jsonp」是什麼意思嗎? –

回答

0

對於JSONP,您的響應必須包含在Javascript函數中。如果您設置了dataType: "jsonp",jquery會自動向GET-URL添加一個回調參數。這個回調參數是一個隨機的js函數名稱,您的ajax請求需要恢復數據交叉原點。

爲了使它工作,你需要改變你的web服務,如下所示:

  1. 變化JSON
  2. 纏上回調參數的響應。例如,在VB.NET:

    Dim returnVal=Request.Param("Callback") & "(" & jsonreturn & ");" 
    Response.Write(returnVal) 
    

請參見本post的細節,讓它與你的web服務ASMX工作。另外,您可以將您的Web服務更改爲CORS

0

此修補程序適用於JQuery的純json調用。 的System.Web內啓用HTTPGET和後從你的web.config

<webServices> 
    <protocols> 
    <add name="HttpSoap"/> 
    <add name="HttpPost"/> 
    <add name="HttpGet"/> 
    <add name="HttpPostLocalhost"/> 
    </protocols> 
</webServices> 

之後,您Global.asax文件創建一個方法,以使橫域通信(vb.net) 「== ==================== EnableCrossDmainAjaxCall =================

Private Sub EnableCrossDmainAjaxCall() 
    HttpContext.Current.Response.AddHeader("Access-Control-Allow-Origin", "*") 

    If HttpContext.Current.Request.HttpMethod = "OPTIONS" Then 
     HttpContext.Current.Response.AddHeader("Access-Control-Allow-Methods", "POST, GET, PUT, DELETE, OPTIONS") 
     HttpContext.Current.Response.AddHeader("Access-Control-Allow-Headers", "Content-Type, Accept") 
     HttpContext.Current.Response.AddHeader("Access-Control-Max-Age", "1728000") 

     HttpContext.Current.Response.AddHeader("Access-Control-Allow-Headers", "origin, x-requested-with, content-type") 
     HttpContext.Current.Response.[End]() 
    End If 

End Sub 

Sub Application_BeginRequest(ByVal sender As Object, ByVal e As EventArgs) 
    HttpContext.Current.Response.Cache.SetCacheability(HttpCacheability.NoCache) 
    HttpContext.Current.Response.Cache.SetNoStore() 
    EnableCrossDmainAjaxCall() 
End Sub 
'==========================