我正在努力弄清楚如何使用 jQuery 对 ASMX Web 服务进行 JSONP 调用。这些只是我已经阅读但没有找到任何解决方案的一些页面:
如何使用 jquery“jsonp”调用外部 web 服务?
使用 jQuery 将跨域 JSON 发布到 ASP.NET
使用 JQuery 访问 ASP.net Web 服务时出错 - JSONP
http://www.codeproject.com/Articles/43038/Accessing-Remote-ASP-NET-Web-Services-Using-JSONP
http://encosia.com/using-jquery-to-consume-aspnet-json-web-services/
ETC...
这是我的示例 .NET Web 方法:
[WebMethod]
[ScriptMethod(UseHttpGet = true, ResponseFormat = ResponseFormat.Json)]
public void GetEmployee(string employeeId, string callback)
{
// Get the employee object from the Factory.
Employee requestedEmployee = EmployeeFactory.GetEmployee(employeeId);
if(requestedEmployee != null)
{
// Return the padded JSON to the caller.
CrossDomainUtility.SendJsonP(callback, requestedEmployee.ToJson());
}
}
这是 SendJsonP():
public static void SendJsonP(string callback, string json)
{
// Clear any response that has already been prepared.
HttpContext.Current.Response.Clear();
// Set the content type to javascript, since we are technically returning Javascript code.
HttpContext.Current.Response.ContentType = "application/javascript";
// Create a function call by wrapping the JSON with the callback function name.
HttpContext.Current.Response.Write(String.Format("{0}({1})", callback, json));
// Complete this request, to prevent the ASMX web service from doing anything else.
HttpContext.Current.ApplicationInstance.CompleteRequest();
}
这是一些示例 jquery 代码:
$.ajax({
url: 'http://devserver/service/service.asmx/GetEmployee',
dataType: 'jsonp',
contentType: 'application/json',
data: { employeeId: '123456789' }
});
我有用 [ScriptService] 装饰的 Web 服务,并且我的 web.config 配置为使用 ScriptHandlerFactory 处理 *.asmx。
我尝试过使用 ASMX 在 Content-Type 为“application/json”时使用的内置 JSON 序列化,但有几个问题:由于需要包裹填充,它不能用于 JSONP .NET 不支持的 JSON。它也不起作用,因为为了序列化 JSON,ASMX 需要一个 'ContentType: application/json' 标头,但 jQuery 在发送 GET 请求时会忽略 ContentType 标头(可能是因为它不发送任何内容)。我尝试在 Global.asax Application_BeginRequest() 中设置 Request.ContentType = "application/json" 但这没有做任何事情。我还尝试使用 beforeSend() 在 jQuery 中设置请求标头,但没有成功。
因此,由于我无法使用内置的 .NET 管道轻松地使其工作,因此我推出了自己的技术,该技术对 Response 主体执行原始写入(因此使用了 SendJsonP() 方法)。不过我仍然遇到问题,因为即使 GetEmployee() Web 方法没有返回值,.NET 也会引发序列化错误,因为它试图将对象序列化为 XML,因为我无法传递“应用程序”的 ContentType /json' 带有 GET 请求。
因此,由于无论我做什么我都无法让 jQuery 添加 ContentType,我想通过使用 Fiddler2 创建手动请求来测试我的 Web 服务:
GET http://devserver/service/service.asmx/GetEmployee?callback=createMember&memberId=123456789
User-Agent: Fiddler
Content-Type: application/json
Host: devserver
...它给出了以下错误,因为我的参数不是 JSON:
{"Message":"Invalid JSON primitive: createMember [....] }
所以毕竟,我有几个问题:
有没有办法使用内置的 .NET 序列化将填充应用于 JSON 并将其返回给客户端?
由于看来我必须自己动手,所以在将带有参数的 JSONP 查询发送到 ASMX 页面时,我的查询字符串应该如何?它必须是 JSON 格式,但我尝试了以下操作并收到“无效的 JSON 原语”错误:
GetEmployee?{callback:"createMember", memberId:"99999999"}
GetEmployee?callback={callback:"createMember"}&memberId={memberId:"123456789"}
有没有办法让 jQuery 发送带有 JSONP GET 请求的 ContentType 标头?