跨域WebService调用未返回预期结果

时间:2014-04-02 09:16:05

标签: jquery ajax web-services

我已经托管了一个网络服务

http://example1.com/webservice.asmx

并希望从

致电

http://example2.com

我有像example2.com中的jQuery代码

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

它像网址一样点击

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

并使用GET方法(来自firebug)点击该网址。实际上哪里有问题我无法找到它。 它以XML格式响应数据。 并且还以XML格式响应数据但未获得成功事件。 但如果我在同一个域上放置相同的代码,它的工作正常。

2 个答案:

答案 0 :(得分:0)

对于JSONP,您的响应必须包含在Javascript函数中。如果设置dataType: "jsonp",Jquery会自动将回调参数添加到GET-URL。此回调参数是一个随机的js函数名称,您的ajax请求需要恢复数据交叉原点。

要使其工作,您需要更改Webservice,如下所示:

  1. 更改为JSON
  2. 使用callback-parameter包装响应。例如在VB.NET中:

    Dim returnVal=Request.Param("Callback") & "(" & jsonreturn & ");"
    Response.Write(returnVal) 
    
  3. 有关使用asmx webservice的详细信息,请参阅此post。您也可以将Web服务更改为CORS

答案 1 :(得分:0)

这个修复程序适用于JQuery的纯json调用。 从system.web

中的web.config启用HttpGet和Post
<webServices>
  <protocols>
    <add name="HttpSoap"/>
    <add name="HttpPost"/>
    <add name="HttpGet"/>
    <add name="HttpPostLocalhost"/>
  </protocols>
</webServices>

然后,在Global.asax文件中创建一个方法以启用跨域通信(vb.net) &#39; ========================== 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
'==========================