当前位置: 首页 > 面试题库 >

从ASMX返回JSON,并在Javascript中正确处理

殳俊
2023-03-14
问题内容

我意识到这里已经有很多类似的问题,但是我无法弄清楚。

我有一个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>

从Google代码下载了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"}

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

我还尝试过类似返回对象“ 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时,我错误地设置了输入类型…

<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来解析JSONWeb服务结果,您将(我希望)找到答案。

更新 :抱歉,您在未发布的地方有一个小错误。为了解决该问题,我用旧版本的Visual
Studio(VS2008)创建了一个小项目,该项目实际上具有您的代码并且可以正常工作。我将其放在http://www.ok-soft-
gmbh.com/jQuery/WSMember.zip上
。您可以下载,编译并验证它是否可以工作。然后,您可以将代码与我的代码进行比较,并找到错误。

最好的祝福



 类似资料:
  • 问题内容: 我正在使用.Net framework 2.0 / jQuery对2.0 Web服务进行Ajax调用。无论我在ajax调用中将contentType设置为什么,该服务始终返回XML。我希望它返回Json! 这里是电话: 这是Fiddler中请求标头的样子: 我尝试将contentType设置为’text / json’并获得相同的结果。 这是Web服务方法: 这是它返回的内容: 有人知

  • 问题内容: 我有一个通过jQuery AJAX调用的PHP脚本。我希望PHP脚本将JSON格式的数据返回给javascript。这是PHP脚本中的伪代码: 基本上,我需要将两个for循环的结果插入$ json中。 问题答案: Php具有内置的JSON序列化功能。 json_encode *如果可以并且不会遭受“此处未发明”综合症, *请 使用它。

  • 问题内容: 我刚刚将我的网站的测试副本升级到asp.net 4.0,并且注意到了一个奇怪的问题,仅当我将网站上传到服务器时才会出现。 该站点有一个返回json的asmx Web服务,但是当我在服务器上运行该站点时,它会返回xml。它在asp.net 3.5中已经运行了一年多。 webMethod装饰有正确的属性… 在我的本地计算机上,它返回json。 但在服务器(Windows 2008 64位)

  • 问题内容: 我使用mysql 5.7 我想将联接表的结果串联到单列中。我使用包裹在函数中的函数。这是查询 列包含来自联接表的数据。数据已正确检索,但问题是列未转换为正确的JSON。 如您所见,最后有点“切”。 我也尝试过,但是现在它不能转换为正确的数组。它看起来像字符串太大,不适合列。有办法解决吗? 更新 问题必须出在不适合列的st大小中。我尝试从联接表中选择较少的列,并且它可以正常工作。也许有一

  • 问题内容: 我需要从C#Web服务获取Json数据。 我知道有一些基于此的问题,相信我,我已经阅读了很多,但只是让我进一步困惑。 这是我所做的: 在我的Web服务中,我包括了:用于类和方法 我还使用了a 将我的数据转换为字符串 我正在使用此服务致电 如果我不使用它,则会收到跨域引用错误。 为此,我必须设置m服务以获取回调函数名称,以便传递t +序列化的Json Data; 但是在输出中我把它包裹起

  • 问题内容: 我想使用ajax和jquery将表单发布到.asmx Web服务,并将Web服务的值作为JSON返回。 我正在使用ASP.NET 4.0。我知道,为了从Web服务返回JSON,需要设置以下内容(1)dataType:“ json”(2)contentType:“ application / json; charset = utf-8”,(3)类型:“ POST” (4)将数据设置为某物