使用 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>
$.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
解决方案似乎是以下之一:
如上文所述,使用HttpModule
将Content-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 服务?
如何使用asp.net按钮通过jquery进行验证然后进入后台代码web表单