使用JQuery访问ASP.net webservice时出错 - JSONP

时间:2009-03-11 17:25:46

标签: asp.net javascript web-services jquery jsonp

请查看下面的代码并帮助我弄清楚我的网络服务代码中出了什么问题。我想建立一个可以使用JSONP使用的asp.net Web服务。我在客户端使用Jquery来访问该站点。即使在设置了适当的属性之后,我的Web服务仍然会发出xml,因为aynch调用失败了。

网络服务

[WebService(Namespace = "http://tempuri.org/")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
 [System.Web.Script.Services.ScriptService]
public class WebService : System.Web.Services.WebService {

    public WebService () {

        //Uncomment the following line if using designed components 
        //InitializeComponent(); 
    }

    [WebMethod]
    [ScriptMethod(ResponseFormat= ResponseFormat.Json, XmlSerializeString=false, UseHttpGet=true)]
    public string HelloWorld(int id, string __callback) {
        return  __callback + "({message: 'Hello World'})";
    }

}

Web服务响应:

<?xml version="1.0" encoding="utf-8"?>
<string xmlns="http://tempuri.org/">test({message: 'Hello World'})</string>

Web.Config中:

<webServices>
    <protocols>
        <add name="HttpGet"/>
        <add name="HttpPost"/>
    </protocols>
</webServices>
<httpHandlers>
    <remove verb="*" path="*.asmx"/>
    <add verb="*" path="*.asmx" validate="false" 
        type="System.Web.Script.Services.ScriptHandlerFactory, 
            System.Web.Extensions, Version=3.5.0.0, 
            Culture=neutral, PublicKeyToken=31BF3856AD364E35"/>
    <add verb="*" path="*_AppService.axd" validate="false" 
        type="System.Web.Script.Services.ScriptHandlerFactory, 
            System.Web.Extensions, Version=3.5.0.0, 
            Culture=neutral, PublicKeyToken=31BF3856AD364E35"/>
    <add verb="GET,HEAD" path="ScriptResource.axd" 
        type="System.Web.Handlers.ScriptResourceHandler, 
            System.Web.Extensions, Version=3.5.0.0, 
            Culture=neutral, PublicKeyToken=31BF3856AD364E35" 
        validate="false"/>
</httpHandlers>
<httpModules>
    <add name="ScriptModule" 
        type="System.Web.Handlers.ScriptModule, System.Web.Extensions, 
            Version=3.5.0.0, Culture=neutral, 
            PublicKeyToken=31BF3856AD364E35"/>
</httpModules>

的Javascript

$.ajax({
    type: "GET",
    contentType: "application/json; charset=utf-8",
    url: "http://localhost:54404/jsonp/webservice.asmx/HelloWorld?id=2&__callback=?", //?jsonp=MatchSvcCallback
    dataType: "jsonp",
    data: {},
    //jsonp : "MatchSvcCallback",
    success: function(msg) {
    alert("Inside success callback function"); // not being called

    },
    error: function(xhr, msg){
        var response = JSON.parse(xhr.responseText);

    }

});

js代码与处理程序一起使用,但由于xml响应而导致web服务失败。

1 个答案:

答案 0 :(得分:5)

我认为这里的问题是因为在使用Content-Type时,jQuery没有在HTTP GET的HTTP请求中设置$.ajax()标头。只有在请求类型为“POST”时才会发送它。这似乎是dataType: "jsonp"dataType: "json"的情况。

我尝试了您的示例并在Fiddler中观看了请求/响应交换,果然我没有在HTTP GET请求的标头中看到Content-Type: application/xml; charset=UTF-8。如果使用HTTP POST,则会发送标头。我猜这个标头的存在是ASP.NET Web服务管道的一个提示,决定是否返回JSON或XML格式的响应。

您似乎并不是唯一遇到此问题的人,请参阅关于优雅代码网站的以下文章:

Calling Remote ASP.NET Web Services from JQuery

解决方案似乎是以下之一:

  • 使用HttpModuleContent-Type: application/xml; charset=UTF-8标头注入请求流,如上文所述。

  • 使用HttpHandler作为端点,正如您在使用ASP.NET Web服务之前所说的那样。

  • 尝试Rick Strahl的基于页面的方法 在下面的文章中(其中 实际上只有HttpHandler):JSONP for cross-site Callbacks