【问题标题】:Calling ASMX WebMethod from jQuery - responseText is blank xhr.status = "error"从 jQuery 调用 ASMX WebMethod - responseText 为空白 xhr.status = "error"
【发布时间】:2011-04-07 04:42:53
【问题描述】:

我完全糊涂了。

  1. jquery v1.5.2 Firefox 3.6.16 ASMX
  2. 列表项
  3. 用VS 2010,.Net Framework 3.5编写的Web服务
  4. 托管在本地计算机的 VS 2010 Development Web 服务器上或开启
  5. 在 Windows Web Server 2008 R2 上运行 IIS 7.5 的主 Web 服务器

本地开发网络服务器和主要生产网络服务器都表现出相同的行为

  1. 从浏览器调用 Web 服务时运行良好。
  2. 我得到了方法列表。
  3. 我可以点击方法名
  4. 我可以点击Invoke按钮,调用方法并返回结果

当我的 jquery 页面调用相同的 web 方法时,会触发错误函数并带有以下状态字段

就绪状态:0 响应文本:“” 状态:0 状态文本:“错误” 错误:函数()

我的 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>

我的网络方法

导入 System.Web.Services

导入 System.Web.Services.Protocols

导入 System.ComponentModel

导入 System.Web.Script.Services

导入 System.Web.Script.Serialization

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

_

_ _

公共课服务1 继承 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

结束类

我在 system.web 下的 web 配置有这些条目,正如我在某处看到的那样

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

_

我已尝试将上述声明注释和取消注释。

据我了解,调用此方法的非 asp.net ajax 页面不应要求这样做。

我做错了什么?

非常感谢

最好的祝福

【问题讨论】:

  • 您的服务在哪个端口上运行?如果您的服务未在与客户端应用程序相同的端口上运行,您可能会遇到跨域问题。
  • 你不需要把完整的 url 只是..url:"ndtvservices.asmx/HelloWorld" 就足够了
  • njebert :感谢您抽出时间回复。当然,我的开发系统运行 asp.net 开发服务器。并且端口不断变化——这就是我在“url”中提到填充localhost:1272 的原因。 Web 服务和 jQuery 在我的本地机器或同一台服务器上运行。在任何情况下,我的开发系统和我的生产网络服务器都在同一个公司 Windows 域上 - 所以,希望不存在跨域问题。
  • TheSuperTramp:感谢您的建议:在这种情况下,我将如何指定端口号?网址:“ndtvservices.asmx:1272/HelloWorld”?我会尝试并报告。感谢您抽出时间。谢谢

标签: jquery asmx webmethod responsetext


【解决方案1】:

您不应该在服务方法中手动 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) ;
}

【讨论】:

  • 是的,是的,是的——你们都是对的。这真是太棒了。
  • 感谢超级百万。三天的强烈挫败感。完全由你们所有人修复。你们中最慷慨的人花时间回答我的问题。
  • 我从来没有收到过回复,不管在其他任何地方都能如此快速地解决问题。我不会再去其他任何地方了,我会尝试做出贡献并帮助人们——不过我知道的不多!
  • 戴夫:谢谢一百万。你让我免于越来越多的挫折!!您不使用完整主机名的建议与取消 JavaScriptSerializer 的建议一样有效。不要检查我是否真的得到 JSON。
  • 戴夫:谢谢一百万。你让我免于越来越多的挫折!!您不使用完整主机名的建议与取消 JavaScriptSerializer 的建议一样有效。不检查我是否真的得到 JSON。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-10-27
  • 1970-01-01
  • 1970-01-01
  • 2013-04-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多