从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中,我做了以下添加(我刚刚在其他post中看到过…这是正常/安全吗?)

        

然后在Default.aspx中,我是两个关键参考…

   

jquery.json-2.2.min.js是从谷歌代码下载的

这是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); } }); }); });  

当我执行它时,编码的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"} 

我仍然得到完全相同的错误……

我也尝试过返回对象“Member”之类的东西,所以代码变为:

 [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时,我错误地设置了输入类型…

  

什么时候应该说:

  

非常感谢所有帮助过的人。

在我看来,你尝试手动使用JavaScriptSerializer().Serialize而不是返回一个对象的主要问题。 Web服务的响应将是双JSON编码。

你是对的! 有很多接近的问题。 看看这里如果ContentType不是JSON,我可以从.asmx Web服务返回JSON吗? 并且无法获取jQuery Ajax来解析JSON Web服务结果 ,您将(我希望)找到答案。

更新 :对不起,但你在某个地方有一个小错误,你没有发布。 为了解决这个问题,我创建了一个带有旧版Visual Studio(VS2008)的小项目,该项目几乎完全符合您的代码和工作原理。 我把它放在http://www.ok-soft-gmbh.com/jQuery/WSMember.zip上 。 您可以下载它,编译并validation它是否有效。 然后你可以将你的代码与我的代码进行比较并找到你的错误

最好的祝福

如果您正在对数据发帖,为什么要定义UseHttpGet = true? 与您的请求中的响应类型相匹配,不应该是假的吗? 另外,在ws调用中设置断点以查看序列化程序返回的确切内容也会有所帮助…如果返回值是字符串,我认为它不应该返回JSON对象。

HTH。

是的,绝对不要手动序列化对象。 如果返回Member类型,框架将为您处理JSON序列化。

当您看到[object XMLHttpRequest]警报时,听起来它正在进入$ .ajax()调用中的error handling程序,其中响应在其XHR对象中作为第一个参数传递。 您可能在服务器上收到500错误。

这是在jQuery中解码ASP.NET AJAX错误响应的示例 。 最简单的是,将error handling程序更改为:

 error: function(xhr, status, error) { var err = eval("(" + xhr.responseText + ")"); alert(err.Message); } 

这将使您了解具体错误是什么。

如果要返回任何复杂对象(具有外键的关系对象),则有2个选项:

  1. 使用DTO对象
  2. 编写您自己的特定序列化转换器

我的英语不好,但这是一个解决方案

—– WSMember.asmx ——

 [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(ResponseFormat = ResponseFormat.Json)] public string GetMember(int IdMember) { Member m = new Member();//Get Member from DB, exam Linq to Sql m.Surname = "Smith"; m.FirstName = "John"; return string.Format("{{ \"Surname\":\"{0}\",\"FirstName\":\"{1}\" }}",m.Surname,m.FirstName); } } 

—- Default.aspx —-

 Just a test