在 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 【问题描述】:问题
我有一个带有 jQuery 代码的 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 Membership - 当您在同一个 WebApp 中调用 WebService 时,经过身份验证的用户会丢失