使用 JQuery 访问 ASP.net Web 服务时出错 - JSONP

Posted

技术标签:

【中文标题】使用 JQuery 访问 ASP.net Web 服务时出错 - JSONP【英文标题】:Error while accessing ASP.net webservice using JQuery - JSONP 【发布时间】:2010-10-12 17:48:18 【问题描述】:

请查看下面的代码并帮助我找出我在 Web 服务代码中做错了什么。我想设置一个可以使用 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】:

我认为这里的问题是因为当使用$.ajax() 时,jQuery 没有在 HTTP GET 的 HTTP 请求中设置 Content-Type 标头。仅当请求类型为“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。

【讨论】:

我使用 $.ajax 的 beforeSent 方法修复了内容类型问题,并使用 firebug 交叉检查了请求标头,它们已正确添加。 我想我必须添加一个 Web 服务扩展来更改响应,以便将回调方法名称添加到响应中,以解决来自 jquery 的“无效标签”错误

以上是关于使用 JQuery 访问 ASP.net Web 服务时出错 - JSONP的主要内容,如果未能解决你的问题,请参考以下文章

ASP.NET - 使用 jQuery 实现基于 JSON 的 Web 服务的正确方法是啥?

如何使用 jQuery 调用 ASP.NET Web 服务?

无法从 jQuery 使用 ASP.NET Web 服务

如何使用asp.net按钮通过jquery进行验证然后进入后台代码web表单

扩展从 JQuery 调用 Web 服务时从 ASP.NET 引发的异常

Asp.net Webservice - 使用 jquery AJAX 安全调用 Web 服务