【问题标题】:"Invalid web service call, missing value for parameter" with jQuery使用 jQuery 的“无效的 Web 服务调用,缺少参数值”
【发布时间】:2019-08-05 10:41:51
【问题描述】:

我有一个使用 WebForms 的网站。它有一项过去可以工作的服务,但我的主机最近将该站点迁移到了新服务器。数据库连接正常,但我的 asmx 服务现已中断。

我有这个签名:

[ScriptMethod(ResponseFormat = ResponseFormat.Json)]
[WebMethod]
public string GetJarLabel(string type, string serialized)
{

我用这个 jQuery 调用:

var requestData = {
            "type":  "jam",
            "serialized": JSON.stringify(data)
};
$.ajax({
            type: "POST",
            url: "/Labels.asmx/GetJarLabel",,
            contentType: "application/json; charset=utf-8",
            dataType: "json",
            processData: false,
            data: JSON.stringify(requestData),
            error: function(xhr, status, ex) {
                ...snip
            },
            success: function(r) {
                ...snip
            }
        });

据我所知,请求似乎已提交,但服务响应 500: Invalid web service call, missing value for parameter: 'type'. 我尝试切换到 GET,字符串化,不字符串化,但没有任何效果。我确信这在迁移之前有效,但看不出这会如何影响它。

【问题讨论】:

  • 我不相信 ASMX WebMethods 可以接受 JSON 作为输入。他们可以退货,但不确定他们是否可以接受。试试这个:删除 processData: false, 并将 data: JSON.stringify(lblData), 更改为 data: lblData,。然后,jQuery 会自动为您对数据参数进行 url 编码。
  • P.S.在上面的代码中,我不知道这是否是拼写错误,但您将lblData 发送到服务器,但它没有定义。您定义了 requestData 但未使用。我假设这只是一个错误,而不是您的真实代码?
  • OTOH,如果您说这曾经可以工作...并且这取决于新服务器上的某些内容,那么服务器之间进行了哪些更改?您是否要求托管公司提供与新服务器的差异列表?也许某处有不同版本的东西。尽管它会影响像这样具体的事情似乎很奇怪。也许您的代码运行在不同版本的 .NET 或其他东西上,这就是我能想到的。
  • @ADyson lblData/requestData 是一个错字,我合并了两种方法来发布这个。我最初省略了processData
  • " 我最初省略了 processData" 。好的,您是否也同时省略了 JSON.stringify() ?这两件事真的是在一起的。你在这里有一个如此简单的结构,你并没有特别将它作为 JSON 发送(毕竟,你将复杂的数据隐藏在“序列化”字符串中)

标签: jquery asp.net ajax web-services asmx


【解决方案1】:

您可以在下面看到您的 ajax 调用。你正在对一个叫做 lblData 的东西进行字符串化。那是什么?那不是您在上面声明的内容。尝试改为传递requestData

$.ajax({
        type: "POST",
        url: "/Labels.asmx/GetJarLabel",,
        contentType: "application/json; charset=utf-8",
        dataType: "json",
        processData: false,
        data: JSON.stringify(lblData),
        error: function(xhr, status, ex) {
            ...snip
        },
        success: function(r) {
            ...snip
        }
    });

我假设无论lblData 是什么,它都没有type 的定义。

【讨论】:

  • 抱歉,打错了。我合并了两种方法来简化发布代码。我已经更正了。
【解决方案2】:

我今天在家里的另一台机器上尝试了这个(以前在工作)。似乎工作有某种奇怪的出站代理设置会干扰请求。我想教训是尝试通过来自不同国家或电话的 VPN。

【讨论】:

    猜你喜欢
    • 2011-09-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多