WebMethod不会在vb.net代码隐藏文件中调用

时间:2018-02-19 21:04:02

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

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

<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);
    }
});

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

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)

有人能告诉我这里缺少什么吗?

2 个答案:

答案 0 :(得分:1)

  

有人能告诉我这里缺少什么吗?

对于初学者,您的返回类型应该是statBiz.GetAllSaleStatistics的返回类型,并且应该返回该调用的结果。您不需要自己启动序列化程序,当Framework能够根据请求标头确定要启动哪个序列化程序时,无需将自己绑定到返回JSON。你当然不应该试图返回JavaScriptSerializer

此示例代码和输出应说明返回序列化器无法工作的原因:

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

{&#34; MaxJsonLength&#34;:2097152,&#34; RecursionLimit&#34;: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为目标。

答案 1 :(得分:0)

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

现在,如果你不喜欢这个答案并且仍想使用你的代码,请从代码中删除webmethod_,在javascript中,你可以使用'<%= GetStatisticData(SomeVariableStoringUserID) %>'传递将调用结果分配给变量在您要查询的用户标识中。

更新:至少可以说,似乎我有点落后于时代。所以@Stephen Kennedy在这方面的回答似乎是正确的。当我认为您期待json文档时,您的方法会返回JavaScriptSerializer