【问题标题】:WebMethod does not get called in vb.net codebehind fileWebMethod 不会在 vb.net 代码隐藏文件中被调用
【发布时间】:2018-07-30 03:48:52
【问题描述】:

我在文件default.aspx.vb中有如下页面方法,使用.NET 2.0:

<WebMethod()> _
Public Shared Function GetStatisticData(ByVal userId As Integer) As JavaScriptSerializer
    Dim stats As JavaScriptSerializer = New JavaScriptSerializer()

    stats.Serialize(statBiz.GetAllSaleStatistics(userId))

    Return stats
End Function

在 default.aspx 中

opt.ajax({
    type: "POST",
    url: 'default.aspx/GetStatisticData',
    data: "{userId: 6601}",
    contentType: "application/json; charset=utf-8",
    dataType: "json",
    success: function (data) {
        console.log(data);
    },
    error: function (request, status, error, response) {
        console.log(error);
    }
});

但是代码隐藏文件中的方法永远不会被命中,我从控制台日志中得到这个错误:

SyntaxError: Unexpected token < in JSON at position 2
    at JSON.parse (<anonymous>)
    at n.parseJSON (jquery-1.12.4.min.js:11)
    at Xb (jquery-1.12.4.min.js:11)
    at y (jquery-1.12.4.min.js:11)
    at XMLHttpRequest.c (jquery-1.12.4.min.js:11)

谁能告诉我这里缺少什么?

【问题讨论】:

  • 你有一个 ScriptServiceAttribute 来装饰你的 WebService 的类吗?
  • 请/检查发布服务器响应(如果确实正在发出请求,当然stackoverflow.com/q/43363866/397817 Fiddler 之类的工具很有帮助。
  • 另外,您使用的是什么版本的 .NET?
  • 这是 .net 2.0 上的旧应用程序
  • 你能在服务器响应中发帖吗?我有一种感觉是XML。是否可以针对 .NET 3.5? (与 2.0 相同的 CLR,但具有额外的功能和错误修复)。

标签: asp.net .net ajax vb.net javascriptserializer


【解决方案1】:

Web 方法由 Web 服务使用,而不是 Web 应用程序。在将 Web 服务添加为服务后,您将 Web 服务安装在服务器上并在代码中调用 (SOAP) Web 服务。 Web 服务文件的扩展名为 .asmx。 Web 服务有点过时(.NET Framwork 2.0 到 3.5),大多数人使用 RESTful api。要创建 Web 服务,请转到 File --> New --> Asp.Net Empty Web application。在该右键单击->添加新项目->webservice模板。

现在,如果您不喜欢该答案但仍想使用您的代码,请从您的代码中删除 webmethod_,然后在 javascript 中,您可以使用 '&lt;%= GetStatisticData(SomeVariableStoringUserID) %&gt;' 将调用结果分配给一个变量,传入您的用户 ID '正在查询。

更新:至少可以这么说,我似乎有点落后于时代。所以@Stephen Kennedy 的答案在这种情况下似乎是正确的。当我认为您需要一个 json 文档时,您的方法会返回 JavaScriptSerializer

【讨论】:

  • 我认为你在这里搞错了 :) 他有一个页面方法,它是在后面的代码中声明的 web 方法。它几乎与 asmx 相同,只是该方法在 .aspx.vb 中声明为静态/共享。他正在使用 jQuery Ajax 调用来调用 web 方法。在正确配置和正确调用时,页面方法能够返回 JSON。是的,这是传统技术,但它应该可以工作。迁移到 asmx 可能不会有任何区别,并且内联建议在这里无关紧要,因为这不是 webform 输出,而是 Ajax 调用。
  • 我不熟悉 Ajax,所以无法发表评论。我是一个有点老派的人,但我从来没有在任何地方看到过在这种情况下使用的网络方法。我一直认为 Web 方法是通过 SOAP 调用的,我没有看到任何迹象表明这里正在使用 SOAP。
  • JSON 功能是由 Microsoft 改造的(在我能告诉/记得的最好的框架 3.5 中)。 Call an ASP.NET C# Method (Web Method) Using JQuery 是一个很好的介绍。我们将它与一些 SOAP 和不断增长的 ASP.NET Web API 一起用于生产中,而且我们远非孤军奋战。
  • 感谢您的信息,我承认我在所有最新技术方面都有些落后。我职业生涯的最后 10 年是一名系统工程师,我已经退休了 2 年。所以我落后了一点……哈哈……
  • 直接调用该方法可以正常工作,但由于我需要使用 ajax 调用它,它必须以这种方式工作;o)
【解决方案2】:

谁能告诉我这里缺少什么?

首先,您的返回类型应该是statBiz.GetAllSaleStatistics 的返回类型,并且应该返回该调用的结果。当框架能够根据请求标头确定要启动哪个序列化程序时,您不需要自己启动序列化程序,也无需将自己绑定到返回 JSON。您当然不应该尝试返回JavaScriptSerializer

这个示例代码和输出应该说明为什么返回序列化器不起作用:

Dim js = New JavaScriptSerializer()
js.Serialize(New List(Of Int32) From { 1, 2, 3})
Console.WriteLine(New JavaScriptSerializer().Serialize(js))

{"MaxJsonLength":2097152,"RecursionLimit":100}

这不是序列化列表!这是一个序列化的序列化器!


为了便于说明,假设statBiz.GetAllSaleStatistics(userId) 返回SaleStatistics 类的实例。请尝试以下方法,但当然要将 SaleStatistics 替换为您的实际类型:

<WebMethod()> _
Public Shared Function GetStatisticData(ByVal userId As Integer) As SaleStatistics
    Return statBiz.GetAllSaleStatistics(userId)
End Function

这本身可能无法完全解决您的问题。我怀疑您的方法正在返回 XML,并且作为遗留应用程序可能存在 entries missing from web.config。您可能还需要以 .NET Framework 3.5 为目标。

【讨论】:

  • 我返回一个统计列表,但是当我在调试模式下运行时我的方法永远不会被命中,当我 tjek 错误和响应的结果时,我得到 1. parsererror 错误:SyntaxError: Unexpected token
猜你喜欢
  • 1970-01-01
  • 2020-02-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-11-22
  • 2018-02-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多