从ASMX返回JSON,并在Javascript中正确处理它
我意识到在这里已经有很多类似的问题,但我无法弄清楚这一点。
我有一个Web服务(C#,.net 3.5)。 你需要知道的基本代码如下:
[WebService(Namespace = "http://tempuri.org/")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
[System.Web.Script.Services.ScriptService]
public class WSMember : System.Web.Services.WebService {
public WSMember () {
}
[WebMethod]
[ScriptMethod(UseHttpGet = true, ResponseFormat = ResponseFormat.Json)]
public string GetMember(string IdMember)
{
//Ignore the parameter for now... I will be looking up a database with it...
//For now just return a minimal object:
Member m = new Member();
m.Surname = "Smith";
m.FirstName = "John";
return new JavaScriptSerializer().Serialize(m);
}
此外,在web.config中,我做了以下补充(我刚刚在其他帖子中看到...这是正常的还是安全的?)
<webServices>
<protocols>
<add name="HttpGet" />
<add name="HttpPost" />
</protocols>
</webServices>
然后在Default.aspx中,我有两个关键引用......
<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.3.2/jquery.min.js"></script>
<script type="text/javascript" src="jquery.json-2.2.min.js" ></script>
jquery.json-2.2.min.js从谷歌代码下载
这里是Javascript:
<script type="text/javascript">
$(document).ready(function() {
$("#button1").click(function(event) {
var myData = { IdMember: "2" };
var encoded = $.toJSON(myData);
alert(encoded);
$.ajax({
type: "POST",
url: "WSMember.asmx/GetMember",
data: encoded,
contentType: "application/json; charset=utf-8",
dataType: "json",
success: function(msg) {
alert("worked" + msg.d);
//$("#sidebar").append(msg);
},
error: function(msg) {
alert(msg.d);
//$("#sidebar").append(msg);
}
});
});
});
</script>
当我执行它时,编码的json出现在消息框中,如预期的那样...即带双引号:
{“IdMember”:“2”}
但是,它总是失败。 即使对于没有传入数据的最基本的Hello World,它也会失败。 我不断收到消息数据的“未定义”。
如果我只使用alert(msg),它会显示[object XMLHttpRequest]
有谁知道我的数据在哪里丢失?
另一个问题是,我在做什么有什么根本错误?
非常感谢。
编辑:
感谢回复家伙。 我已经尝试了以下所以...
UseHttpGet = true现在更改为false。 (再次 - 我看到它在某个地方,所以我尝试了...但我知道它不可能是正确的: - /)
假设Web服务现在返回一个字符串。 我建立如下字符串(看起来有点疯狂...序列化它做了完全相同的事情...)
StringBuilder sb = new StringBuilder();
sb.Append("{");
sb.Append(""Surname":");
sb.Append(""");
sb.Append(m.Surname);
sb.Append(""");
sb.Append(","FirstName":");
sb.Append(""");
sb.Append(m.FirstName);
sb.Append(""");
sb.Append("}");
return sb.ToString();
此代码返回如下内容:
{"Surname":"Smith","FirstName":"John"}
我仍然得到完全相同的错误...
我也试过类似返回对象“成员”,所以代码变成:
[WebMethod]
[ScriptMethod(ResponseFormat = ResponseFormat.Json)]
public Member GetMember(string IdMember)
{
Member m = new Member();
m.Surname = "Smith";
m.FirstName = "John";
return m;
}
这也会引发相同的错误。
对不起,我很痛苦...我已经阅读了这些链接和其他内容。 只是看不出为什么这有什么不同。
是否有任何额外的配置设置,我需要知道可能?
非常感谢回复。
更新:问题已修复。 上述代码中的关键错误是:
[ScriptMethod(UseHttpGet = true, ResponseFormat = ResponseFormat.Json)]
应该
[ScriptMethod(ResponseFormat = ResponseFormat.Json)]
此外,在窗体上,当使用按钮来调用JavaScript时,我错误地设置了输入类型...
<input id="button1" type="submit" value="Just a test" />
当它应该说:
<input id="button1" type="button" value="Just a test" />
非常感谢所有帮助过的人。
在我看来,您尝试手动使用JavaScriptSerializer().Serialize
而不是返回对象是您的主要问题。 来自Web服务的响应将采用双JSON编码。
你是对的! 有很多密切的问题。 看看这里如果ContentType不是JSON,我可以从.asmx Web服务返回JSON吗? 和无法获得jQuery Ajax来解析JSON webservice结果,你会(我希望)找到答案。
更新 :对不起,但你有一个小的错误,你没有发布的地方。 为了解决这个问题,我用一个老版本的Visual Studio(VS2008)创建了一个小型项目,它几乎完全符合您的代码和哪些工作。 我将它放在http://www.ok-soft-gmbh.com/jQuery/WSMember.zip上。 您可以下载它,编译并验证它是否有效。 然后你可以比较你的代码和我的并找到你的错误。
最好的祝福
如果你正在为你的数据做一篇文章,为什么你要定义UseHttpGet = true? 这不应该是错误的以匹配您的请求中的响应类型吗? 另外,在ws中放置一个断点以查看序列化程序返回的内容也会有所帮助......如果返回值是字符串,我不认为它应该返回JSON对象。
HTH。
是的,绝对不要手动序列化对象。 如果您返回一个Member
类型,框架将为您处理JSON序列化。
当您看到[对象XMLHttpRequest]警报时,听起来好像进入$ .ajax()调用中的错误处理程序,响应在其XHR对象中作为第一个参数传递。 您可能在服务器上发生500错误。
以下是解码jQuery中的ASP.NET AJAX错误响应的示例。 最简单的,将你的错误处理程序更改为:
error: function(xhr, status, error) {
var err = eval("(" + xhr.responseText + ")");
alert(err.Message);
}
这会让你对特定的错误有所了解。
链接地址: http://www.djcxy.com/p/46699.html上一篇: Returning JSON from ASMX, and handling it correctly in Javascript