【问题标题】:Why Does Calling My ASP.NET WebMethod Invoke My Error Handler?为什么调用我的 ASP.NET WebMethod 会调用我的错误处理程序?
【发布时间】:2011-11-16 19:48:17
【问题描述】:

我正在尝试使用 AJAX 从 ASP.NET 网页调用 Web 服务。但它总是调用我的错误处理程序而不是我的成功处理程序。

这是我的 javascript:

function DeleteCurrency(currenciesId) {
    $.ajax({
        url: "Ajax/Currencies.asmx/GetCurrencyUsage",
        data: "{ 'currencyId' : '" + currenciesId + "' }",
        failure: function (msg) {
            alert('Failure: ' + msg);
        },
        error: function (result, thrownError) {
            alert('Error:');
        },
        success: function (results) {
            alert('Success: ' + results);
        }
    });
}

这是我的 asmx 文件中的代码:

/// <summary>
/// Summary description for Currencies
/// </summary>
[WebService(Namespace = "http://xxx.com/")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
[System.Web.Script.Services.ScriptService]
[System.ComponentModel.ToolboxItem(false)]
public class Currencies : System.Web.Services.WebService
{
    [WebMethod]
    public string[] GetCurrencyUsage(int currencyId) {
        List<string> list = new List<string>();
        list.Add(currencyId.ToString());
        list.Add("This is item 1");
        list.Add("This is item 2");
        list.Add("This is item 3");
        list.Add("This is item 4");
        list.Add("This is item 5");
        return list.ToArray();
    }
}

根据 Fiddler 的说法,这是我要发送的内容:

{ 'currencyId' : 3 }

这是 web 服务返回的内容:

{"d":["3","This is item 1","This is item 2","This is item 3","This is item 4","This is item 5"]}

如前所述,我的错误处理程序被调用。但是结果参数的状态显示“OK”和200。第二个参数的类型是parsererror

所有数据似乎都在那里,那么错误在哪里。它与结果中的“d”有关吗?我不知道下一步该去哪里。

编辑:

进一步的测试表明,如果我将 Web 服务更改为返回单个字符串(而不是数组),一切都会按预期工作。

显然,我的 Web 服务被正确调用,它返回的状态为 200(OK),并且它也返回了预期的数据。但是当有多个值时,解析结果会出现某种错误。我仍然想知道它是否与“D”有关,但我不确定。

【问题讨论】:

  • 调用是否真的返回数据?您可能会指定 contentType: "application/json; charset=utf-8"dataType: "json" 选项。 (source)
  • 是的,正如我所提到的,所有数据似乎都在那里(使用调试器查看)并且 Fiddler 显示它正在返回。我已经尝试过这两种设置(以及许多其他设置),但都没有帮助。
  • 答案中的 D 是正常的。这是 Microsoft 添加到 Json 的一种安全措施。
  • @Daok:我知道“D”是 MS 的一项安全措施。但似乎请求工作正常,但我在某处返回的数据出现解析错误。所以很自然地想知道解析“D”是否有问题。

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


【解决方案1】:

尝试添加:

contentType: "application/json; charset=utf-8" ,
dataType: "json",
type: "POST",

到你的ajax请求

在您的成功处理程序上,调用:

alert('Success: ' + results.d.length);

它应该提醒5

另外,我以前从未见过那个“失败”处理程序。我现在将其注释掉以防万一......我认为“错误”处理程序就足够了。

【讨论】:

  • 感谢您的回复。在尝试解决这个问题时,我已经尝试过那些额外的属性值。但为了更好地衡量,我将您的代码粘贴到我的代码中,但得到了完全相同的结果。不能做 alert() 声明,因为我没有那么远。还删除了故障处理程序。结果相同。
【解决方案2】:

这是我用来调用我的 asmx 服务的内容。您的其他代码看起来不错。

 <script type="text/javascript">  
   function testAsmx() {  
    $.ajax({  
       type: "POST",  
       url: "http://localhost/ASMXtoWCF/test.asmx/HelloWorld",  
       dataType: "json",  
       data: '{"variable":"testme"}',  
        contentType: "application/json; charset=utf-8",  
        success: function (msg) {  
          alert(msg.d);  
        },  
        error: function (msg) {  
          alert("I am a failure");  
        }  
      });  
    }  
</script>

【讨论】:

    【解决方案3】:

    已解决

    我终于能够纠正这个问题。这似乎是我们使用旧版本的 jQuery (1.2.6) 和我们配置它的方式的结合。具体来说,我们在$.ajaxSetup() 中有行dataType: "json"

    由于我仍然不完全理解的原因,删除此行导致代码开始按预期工作。

    感谢所有 cmets。用我提供的信息估计很难解决这个问题。

    【讨论】:

      猜你喜欢
      • 2011-05-23
      • 2015-06-03
      • 2019-09-26
      • 1970-01-01
      • 1970-01-01
      • 2018-06-02
      • 1970-01-01
      • 2020-10-29
      • 1970-01-01
      相关资源
      最近更新 更多