我试图使用jQuery + Ajax调用自制的vb.net Web服务,而且我正在努力解决这些问题。
这是一个以网络方式公开的小功能:
<WebMethod()> <ScriptMethod(ResponseFormat:=ResponseFormat.Xml, UseHttpGet:=True)> _
Public Function GetAllVotes() As XmlDocument
Dim theVotes = getVotes()
Dim strResult As String = theVotes.XMLSerialize
Dim doc As XmlDocument = New XmlDocument()
doc.LoadXml(strResult)
Return doc
End Function
在查看网页后,我已经添加了ScriptMethod属性,因为我正在返回XML,但如果情况确实如此,请随时告诉我我不需要它们。
然后,在客户端,这是代码:
function getVotes() {
$.support.cors = true;
$.ajax({
type: "GET",
contentType: "application/json",
url: "http://nhrd635:8008/votingmanager.asmx/GetAllVotes",
data: {},
dataType: "xml text jsonp",
success: function(msg) {
// Hide the fake progress indicator graphic.
// Insert the returned HTML into the <div>.
$('#myPlaceHolder').html(msg);
},
error: function(msg) {
$('#myPlaceHolder').html(msg);
// alert(msg);
}
});
}
我已经尝试了许多此代码的变体,使用post或get,更改内容类型,有或没有charset = utf-8。有和没有双引号的数据:{}。
我使用firebug跟踪输出我的请求。只有当我将dataType设置为jsonp时才能获得结果,但在所有情况下,代码最终都会出现&#34;错误&#34;功能,即使状态给200 OK。但我知道将它设置为jsonp是错误的,因为这会将我的xml视为实际的javascript ...
我已经阅读了一篇来自一个有趣的人的非常有用的博客文章。 (样本:http://encosia.com/3-mistakes-to-avoid-when-using-jquery-with-aspnet-ajax/)
但即便按照他的例子,我也无法得到适当的回报。
我做错了什么非常明显?事实是我返回一个xml字符串而不是一个json序列化字符串?
答案 0 :(得分:0)
通过更多地了解Stack Overflow和来自Encosia的Dave Ward的帮助,我成功地解决了我的问题。我认为我应该在这里发布我的最终解决方案,以防将来帮助某人。
首先,Web服务是一种糟糕的方式,我按照HttpHandler solution的说法,按照Dave Ward的回复我原来的问题的建议。
返回XML也是一个糟糕的选择,我并没有真正意识到这一点。我在我的项目中添加了对JSon.net的引用,并使用它将我的对象转换为Json字符串。
我真的很想坚持使用“.net”转换为json字符串,如Dave's blog post中所述,但不知怎的,我努力学习如何指示.net自动转换为Json,如Dave的例子,所以我采取了一个简单的方法与Json.net“让它工作”
然后,在我的HttpHandler中,我有响应字符串,遵循StackOverflow上这篇文章的说明:
https://stackoverflow.com/a/3703221/1060133
就我而言,它是:
context.Response.Write(String.Format("{0}({1});", context.Request("callback"), jsonVotes))
jquery调用也使用了上述帖子中的说明。
有趣的是,即使在无参数调用中,您也必须像这样发送空数据:
$.getJSON('http://url/httpHandler.ashx?callback=?', {},
function(data) {
alert(data);
}
);
祝您好运......
答案 1 :(得分:-1)
我认为你在这里遇到的大部分麻烦可能源于跨源请求(甚至在同一台机器上的不同端口上发出请求)。这就是为什么当你切换到JSONP时你能够获得一丝工作的原因。不幸的是,ASMX“ScriptServices”不支持JSONP,因此WebMethod返回的数据不是jQuery注入的JSONP回调函数的有效参数。
如果可能的话,最好的解决方案是让服务在与调用它的页面相同的域上运行。对于跨源问题有各种解决方案,但它们都不像对发出请求的页面所在的同一域的简单XHR请求那样广泛兼容/可靠。
如果您不能这样做,请考虑为提供votingmanager.asmx的网站启用CORS支持。这在大多数IE版本中都不起作用,但允许在其他浏览器中使用跨源请求。有关如何执行此操作的详细信息:http://encosia.com/using-cors-to-access-asp-net-services-across-domains/
切线,如果可能的话,我会避免使用额外的XML序列化层。如果getVotes()返回类似List的内容,则将其用作返回类型,并让ASP.NET自动将集合序列化为JSON,然后jQuery将自动将其转换为成功处理程序中的JavaScript数组。有关此处的更多信息:http://encosia.com/asp-net-web-services-mistake-manual-json-serialization/