【问题标题】:using jQuery AJAX with asp.net webservices always goes to error: instead of success:在 asp.net webservices 中使用 jQuery AJAX 总是出错:而不是成功:
【发布时间】: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\"}}";
  }
}

【问题讨论】:

    标签: asp.net javascript web-services jquery


    【解决方案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 的错误都消失了。

        【讨论】:

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