从jQuery调用ASMX WebMethod - responseText是空白的xhr.status =“error”

时间:2011-04-07 04:42:54

标签: jquery asmx webmethod responsetext

完全陷入困境。

  1. jquery v1.5.2 Firefox 3.6.16 ASMX
  2. 列表项
  3. 使用VS 2010,.Net Framework 3.5编写的Web服务
  4. 托管在本地计算机的VS 2010开发网络服务器上或打开
  5. 在Windows Web Server 2008 R2上运行IIS 7.5的主Web服务器
  6. 本地开发者Web服务器和主要生产Web服务器都表现出相同的行为

    1. 从浏览器调用Web服务时效果很好。
    2. 我得到了方法列表。
    3. 我可以点击方法名称
    4. 我可以单击Invoke按钮,调用方法并返回结果
    5. 当我的jquery页面调用相同的Web方法时,将使用以下状态字段触发错误函数

      readyState:0 responseText:“” 状态:0 statusText:“错误” 错误:function()

      我的jQuery部分

              <script type="text/javascript">
                    $(document).ready(function() {
                          $.ajax({
                              type: 'POST',
                              url: 'http://localhost:1272/ndtvservices.asmx/HelloWorld',
                              data: '{}',
                              contentType: 'application/json; charset=utf-8',
                              dataType: 'json',
                              success: function(msg) {
                                       alert("success " + msg) ;
                              },
                              error: function(xhr, status, error) {
                                       var err = eval("(" + xhr.responseText + ")");
                                       alert(err.Message) ;
                              }
                          });
                     });
              </script>
      

      我的网络方法

      Imports System.Web.Services

      Imports System.Web.Services.Protocols

      导入System.ComponentModel

      导入System.Web.Script.Services

      导入System.Web.Script.Serialization

      '要允许使用ASP.NET AJAX从脚本调用此Web Service,请取消注释以下行。 '_

      _

      _  _

      Public Class Service1 继承System.Web.Services.WebService

      '<ScriptMethod(ResponseFormat:=ResponseFormat.Json, UseHttpGet:=False, XmlSerializeString:=False)> _
      <WebMethod()> _
      Public Function HelloWorld() As String
          Dim js As New JavaScriptSerializer
          Dim s As String = "Hello World"
          Dim sReturn As String = js.Serialize(s)
          Return sReturn
      End Function
      

      结束班

      我在web.web下的web配置包含了我在某处看到的那些条目

        <webServices>
          <protocols>
            <add name="HttpGet"></add>
            <add name="HttpPost"></add>
          </protocols>
        </webServices>
      

      _

      我已尝试使用上述声明进行评论和取消评论。

      据我所知,对于调用此方法的非asp.net ajax页面,这不应该是必需的。

      我做错了什么?

      非常感谢

      祝福

      艾尔

1 个答案:

答案 0 :(得分:2)

您不应该手动JSON序列化服务方法中的响应。 ASP.NET已经为您自动完成了这项工作。您所需要的只是:

<WebMethod()> _
Public Function HelloWorld() As String
  Return "Hello World"
End Function

并确保您的服务使用ScriptService属性进行修饰(我的VB.NET非常生疏,所以这可能会有所不同):

<ScriptService()> _
Public Class ndtvservices Inherits WebSerivce

另外,我会避免在$ .ajax()的url参数中使用完全限定的URI。这应该是你所需要的:

url: '/ndtvservices.asmx/HelloWorld'

最后,如果您使用的是ASP.NET 3.5或更高版本,ASP.NET wraps the JSON response in a ".d" object可以防止针对JSON数组的特定安全问题。你想在成功回调中“点”到那个包装器对象,如下所示:

success: function(msg) {
  alert("success " + msg.d) ;
}