1

我试图在 WebForms 应用程序中通过 AJAX 调用 Web 服务。

我的脚本看起来像这样:

$.post('UpdateServer.asmx/ProcessItem',
    'itemId=' + $(this).text(),
    function (result) {
        alert(result);
    });

我的网络服务看起来像这样。

[WebService(Namespace = "http://tempuri.org/")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
[System.ComponentModel.ToolboxItem(false)]
[System.Web.Script.Services.ScriptService]
public class UpdateServer : System.Web.Services.WebService
{
    [WebMethod]
    public string ProcessItem(int itemId)
    {
        return new JavaScriptSerializer().Serialize(
            new { Success = true, Message = "Here I am!" });
    }
}

Web 方法按预期调用,并带有预期的参数。但是,传递给我的成功函数的参数($.post() 的最后一个参数)是文档类型,不包含我期望的 Success 和 Message 成员。

有什么神奇的词可以让我找回我期待的对象?

编辑

经过仔细检查,我可以找到我要查找的数据,如下所示:

result.childNodes[0].childNodes[0].data: "{"Success":true,"Message":"服务器更新成功!"}"

4

3 回答 3

2

您看到以 JSON 结尾的奇怪节点结构的原因是您没有调用该服务,这是将 JSON 从 ASMX ScriptServices 中诱出然后返回 JSON 字符串的必要方法。因此,最终结果是您返回的 XML 文档包含该 JSON 字符串的单个值。

您现在遇到的两个具体问题是您正在手动 JSON 序列化您的返回值,并且您没有使用 Content-Type 调用服务application/json(.NET 需要切换到 JSON 序列化响应)。

解决这些问题后,您还会遇到“无效 JSON 原语”错误,因为 data 参数是 URL 编码的,而不是有效的 JSON 字符串

要使其正常工作,请在服务器端执行此操作:

[ScriptService]
public class UpdateServer : System.Web.Services.WebService
{
  [WebMethod]
  public object ProcessItem(int itemId)
  {
    return new { Success = true, Message = "Here I am!" };
  }
}

如果需要,您还可以创建一个数据传输对象(又名 ViewModel)来返回,而不是使用匿名类型object

要成功地从中获取原始 JSON,请在客户端执行以下操作:

$.ajax({
  url: 'UpdateServer.asmx/ProcessItem',
  type: 'post',
  contentType: 'application/json',
  data: '{"itemId":' + $(this).text() + '}',
  success: function(result) {
    // This will be { d: { Success: true, Message: "Here I am!" } }.
    console.log(result);
  }
});

如果您有几分钟的时间,请阅读jQuery 的通信部分中的帖子,供 ASP.NET 开发人员使用。当您继续沿着这条道路前进时,您会发现很多有用的信息。

注意:helmus 留下的链接是相关的。在使用 ASMX ScriptServices 通过 JSON 进行通信方面,从 2.0 到现在没有发生根本性的变化。如果您对 .NET 中解决此问题的真正前沿方法感兴趣,那么 ASP.NET Web API 就是您的最佳选择。

于 2012-04-15T22:46:18.453 回答
0

将此属性添加到您的 ProcessItem 方法:

[ScriptMethod(ResponseFormat = ResponseFormat.Json)]
于 2012-04-15T21:09:48.070 回答
0

在你的$.post电话中更加明确。

$.ajax({
    type:'post',
    url:'UpdateServer.asmx/ProcessItem',
    data: {'itemId':$(this).text()}
}).done(function (result) {
        alert(result);
});
于 2012-04-15T21:10:49.020 回答