从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

下一篇: How to intercept every AJAX request from a webpage