0

我正在尝试使用 jQuery+Ajax 调用自制的 vb.net Web 服务,但我正在努力解决细节问题。

这是一个作为 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 时,我才会得到结果,但在所有情况下,代码都会以“错误”函数结束,即使状态给出 200 OK。但我知道将其设置为 jsonp 是错误的,因为这会使我的 xml 被视为实际的 javascript ...

我从一个关于 encosia 的人那里读到了非常有用的博客文章。(示例:http ://encosia.com/3-mistakes-to-avoid-when-using-jquery-with-aspnet-ajax/ )

但即使按照他的例子,我也无法获得适当的回报。

我做错了什么很明显吗?是我返回一个 xml 字符串而不是一个 json 序列化字符串的事实吗?

4

2 回答 2

0

随着对 Stack Overflow 的更多阅读以及来自 Encosia 的 Dave Ward 的帮助,我已经设法解决了我的问题。我想我应该在这里发布我的最终解决方案,以防将来对某人有所帮助。

首先,Web 服务是一种不好的方法,我使用了HttpHandler 解决方案,正如 Dave Ward 在回答我最初的问题时所建议的那样。

返回 XML 也是一个糟糕的选择,我并没有真正意识到这一点。我在我的项目中添加了对 JSon.net 的引用,并使用它将我的对象转换为 Json 字符串。

正如Dave 的博客文章中所建议的那样,我真的很想坚持使用“.net only”来转换为 json 字符串,但不知何故,我努力学习如何指导 .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);
          }
); 

祝你好运...

于 2013-01-15T15:37:45.540 回答
-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/

于 2013-01-11T07:16:08.360 回答