在 asp.net webservices 中使用 jQuery AJAX 总是出错:而不是成功:

Posted

技术标签:

【中文标题】在 asp.net webservices 中使用 jQuery AJAX 总是出错:而不是成功:【英文标题】:using jQuery AJAX with asp.net webservices always goes to error: instead of success: 【发布时间】:2010-12-23 15:01:02 【问题描述】:

问题

我有一个带有 jQ​​uery 代码的 aspx 页面,用于将 ajax 请求发送到 asmx Web 服务文件(在同一网站上)。返回的响应并不一致,但是,它始终触发“错误”jQuery 回调而不是“成功”回调。状态码在 200、12030 和 12031 之间不一致。回调消息的responseText 在 [blank] 和 json Web 服务返回的实际 XML 之间不一致。我调试了代码,webservice 确实没有任何异常地执行。

ASPX 代码

//代码省略

<script type="text/javascript">
jQuery(document).ready(function()

  jQuery.ajax(
  type: "POST",
    contentType: "application/json; charset=utf-8",
    url: "CallDequeue.asmx/Dequeue",
    data: "",
    dataType: "json",
    success: function(Msg)
    
      alert('success:' + Msg.responseText);
    ,
    error: function(Msg)
    
      alert('failed:' + Msg.status + ':' + Msg.responseText);
    
  );
);
</script>

//代码省略

网络服务代码

[WebService(Namespace = "http://tempuri.org/")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
[ScriptService]
public class CallDequeue : System.Web.Services.WebService

  [WebMethod]
  public string Dequeue()
  
    return "\"d\":\"FirstName\":\"Keivan\"";
  

【问题讨论】:

【参考方案1】:

当您将服务标记为 ScriptService 时,它​​会自动处理 JSON 序列化。您不应该手动序列化响应。

如果您希望返回作为“FirstName”返回,那么您可以使用 DTO 类来控制语法。只是返回一个字符串,它会返回为 'd':'Keivan' 而不是 'd':'FirstName':'Keivan'。

[ScriptService]
public class CallDequeue : System.Web.Services.WebService

  public class PersonDTO
  
    public string FirstName;
  

  [WebMethod]
  public PersonDTO Dequeue()
  
    var p = new PersonDTO();

    p.FirstName = "Keivan";

    return p;
  

调用语法的一些变化:

jQuery(document).ready(function() 
  jQuery.ajax(
    type: "POST",
    contentType: "application/json; charset=utf-8",
    url: "CallDequeue.asmx/Dequeue",
    data: "",
    dataType: "json",
    success: function(Msg) 
      // Unless you're using 2.0, the data comes back wrapped
      //  in a .d object.
      //
      // This would just be Msg.d if you return a string instead
      //  of the DTO.
      alert('success:' + Msg.d.FirstName);
    ,
    error: function(Msg) 
      alert('failed:' + Msg.status + ':' + Msg.responseText);
    
  );
);

如果您有兴趣,可以阅读more about ASP.NET AJAX's .d wrapper here。

更新:

使用 ASP.NET 2.0,需要安装the ASP.NET AJAX Extensions v1.0。此外,make sure your web.config is configured for ASP.NET AJAX(尤其是 HttpHandlers 部分)。

【讨论】:

我将 Web 服务代码更改为只返回“Keivan”,但它仍然调用错误:回调,因为响应以 XML 而不是 JSON 的形式返回。这是一个 .net 2.0 网站。返回字符串时如何使其返回纯JSON? 用几个步骤更新了答案,这些步骤是让 JSON 序列化在 2.0 中工作所必需的。【参考方案2】:

This 问题很可能对您有所帮助。

否则,我将此 Web 服务转换为页面方法并立即运行。你有这个选项吗?

CS:

public partial class test : System.Web.UI.Page

    protected void Page_Load(object sender, EventArgs e)
    

    

    [WebMethod]
    public static string Dequeue()
    
        return "\"d\":\"FirstName\":\"Keivan\"";
    

ASPX:

<script type="text/javascript">
    jQuery(document).ready(function()
    
            jQuery.ajax(
            type: "POST",
              contentType: "application/json; charset=utf-8",
              url: "test.aspx/Dequeue",
              data: "",
              dataType: "json",
              success: function(Msg)
              
                    alert('success:' + Msg.responseText);
              ,
              error: function(Msg)
              
                    alert('failed:' + Msg.status + ':' + Msg.responseText);
              
            );     
    );

查看this 和其他 Encosia 文章了解更多信息。

【讨论】:

【参考方案3】:

你说它是 json,但它返回 xml。我看到那里有轻微的脱节。

【讨论】:

对,所以当你在一个webservice上设置“ScriptService”属性时,默认情况下,每个ScriptMethod上的响应都会自动设置为Response.Json。响应以由 XML 包装的 JSON 形式返回(不是通常返回的 soap xml 消息)。这能回答你的问题吗? 这里的问题是,如果你告诉 jquery 响应将以 JSON 格式出现,但它确实是 XML(其中一个元素包含带有 JSON 的 CDATA),你就是在欺骗 jquery,并且混淆它。当您说 JSON 时,它期望整个响应主体是 JSON,句号。如果ajax请求真的应该返回XML(如你所说),你需要使用适当的参数(s/json/xml/),然后自己评估JSON数据。 那么如何让我的 web 服务返回 JSON 而不用 XML 包装?这是在 ASP.NET 2.0 中【参考方案4】:

这么简单的答案。我的 web.config 没有启用 ajax,所以所有调用(不管我的 web 服务是脚本服务)都返回 XML 而不是纯 json。

【讨论】:

嗨,我在将近一年后再次来到这里继续这个话题。我也遇到了与在 $.ajax() 中调用 Web 服务时出错相同的问题。为了阐明我需要修改哪个 web.config 文件以启用 AJX。是 webservice web.config 还是网站的?在我的场景中,我的网站不是 asp.net 网站。它只是一个验证用户凭据的表单,它没有附加 web.config 文件。那么我可以修改哪个文件。提前致谢【参考方案5】:

尝试使用 [ScriptMethod] 标记您的网络方法

如:

[WebMethod]
[ScriptMethod]

【讨论】:

【参考方案6】:

在这里感谢所有响应者。

一定要在要使用的方法前面加上这些属性

[WebMethod] 
[ScriptMethod] 

不确定何时需要 ScriptMethod?

奇怪的是,他的下载代码中没有[Script Service][WebMethod]

反正经过以上改动,aJax 500 12030 12031 的错误都消失了。

【讨论】:

以上是关于在 asp.net webservices 中使用 jQuery AJAX 总是出错:而不是成功:的主要内容,如果未能解决你的问题,请参考以下文章

如何在 c# ASP.Net 中使用有效的 JSON 输出创建 JSON WebService 并使用 JQuery/Ajax 进行查询

在 asp.net webservices 中使用 jQuery AJAX 总是出错:而不是成功:

使用 jquery 从 asp.net webservice 解析简单的 xml

ASP.NET WebService - 实体框架

ASP.NET Membership - 当您在同一个 WebApp 中调用 WebService 时,经过身份验证的用户会丢失

无法使用 AFNetworking 将 iOS 连接到 asp.net webservices