从jQuery + Ajax调用.Net Web服务

时间:2013-01-10 19:16:40

标签: json web-services asmx

我试图使用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序列化字符串?

2 个答案:

答案 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/