【问题标题】:ASP.NET JSON web service always return the JSON response wrapped in XMLASP.NET JSON Web 服务始终返回包装在 XML 中的 JSON 响应
【发布时间】:2009-07-13 19:27:20
【问题描述】:

我看到了一个类似的问题,但它没有解决我的问题。我在 ASMX 文件中有一个 JSON Web 服务;

web方法的代码

        [WebMethod]
        [ScriptMethod(ResponseFormat = ResponseFormat.Json)]
        public string GetUserRoles(string JSONUserCode)
        {
            string retRoles = string.Empty;
            List<JSONRole> roles = new List<JSONRole>();

            {... I Populate the roles here ...}

            DataContractJsonSerializer serializer = new
            DataContractJsonSerializer(roles.GetType());
            MemoryStream ms = new MemoryStream();
            serializer.WriteObject(ms, roles);
            string jsonString = Encoding.Default.GetString(ms.ToArray());
            ms.Close();
            return jsonString;
        }

这会正确格式化 List,但会将整个返回值包装在 XML 中。回复如下:

<?xml version="1.0" encoding="utf-8" ?> 
    <string xmlns="http://formshare.com/">
       [{"Name":"Accounts Payable"},{"Name":"Payroll"}]
    </string>

您可以通过单击此链接查看您自己的回复:

http://dev.formshare.gologictech.com/JSON/JSONService.asmx/GetUserRoles?JSONUserCode=1234

我只需要回复:

[{"Name":"Accounts Payable"},{"Name":"Payroll"}]

有什么想法吗?感谢您的帮助。

【问题讨论】:

    标签: xml json asmx


    【解决方案1】:

    WebMethod 能够提供与 XML 和 JSON 相同的信息。您需要在提交请求时在客户端中指定您想要的格式(dataType)。

    另外,您不应该手动将对象序列化为 JSON,而是返回 roles,如果您的客户端将数据请求为 JSON,它将被序列化为 JSON。

    编辑

    jQuery 示例(注意 dataType 参数):

    $.ajax({
       type: 'GET',
       url: 'http://dev.formshare.gologictech.com/JSON/JSONService.asmx/GetUserRoles',
       contentType: 'application/json; charset=utf-8',
       dataType: 'json',
       data: '{"JSONUserCode":"1234"}',
       success: myCallback
    });
    

    值得一提的是,该对象不会以您指定的格式返回,而是包装在一个对象中:

    { d: [ {"Name":"Accounts Payable"}, {"Name":"Payroll"} ] }
    

    然而,这实际上是非常可取的,for added security

    【讨论】:

    • 有没有在 POST 中指定数据类型?
    • 我不确定我是否遵循...上面的示例是一个 POST。
    • 对不起,我的意思是在 URL 中传递参数,就像我在问题中包含的 URL 一样。
    • 啊,对。我更新了上面的示例以使用您正在使用的 url 和参数。使用 'GET' 而不是 'POST',传入 'data' 的数据将通过查询字符串而不是表单值来检索。
    • 由于 $.ajax() 不适用于跨站点使用,我必须使用 $.getJSON(),并且我的服务返回 JSONP。我有同样的问题,json结果被包装在xml中。由于我使用的是 $.getJSON(),因此我不确定如何设置标头来告诉服务我想要一个 json 结果,而不是 xml 结果。任何想法如何做到这一点,只是通过 URL? .NET 服务是否在查询字符串中寻找一些内置参数?
    【解决方案2】:

    原来重要的不是 dataType,而是

    contentType: 'application/json; charset=utf-8'.  
    

    它就像一个魅力。

    【讨论】:

      【解决方案3】:

      确保您的服务类具有 [ScriptService] 属性。默认不添加该属性。

      【讨论】:

        【解决方案4】:

        试试 Jayrock for .NET,它是 .NET JSON RPC 的简洁处理程序。它会完全满足您的需求。 ASP .NET JSON RPC here 有一个分步操作方法。

        【讨论】:

          【解决方案5】:

          我自己处理序列化时也犯了同样的错误。您不应该返回字符串,而是返回对象本身。

          如果您已经开发了一百个这样的服务,那么您可以解决以下问题:只需创建一个 aspx,ServiceCaller.aspx,删除 html 中的所有内容,只需保留页面指令并使用代码隐藏来调用服务和响应。写字符串。也可以将Service方法名作为“HelloWorld”之类的参数,并使用反射来调用它。

          这有点像用右手展示你的左耳,但它有效。您还可以轻松集成角色管理并使用反射获取服务名称作为字符串检查数据库是否用户可以调用此服务并使用反射调用该方法。

          (欢迎任何关于此的 cmets :)

          【讨论】:

            【解决方案6】:

            这样使用不返回字符串类型。直接写

            public void Metod()
                {
                    json = jss.Serialize(Data);
                    Context.Response.Write(json);
                }
            

            【讨论】:

              【解决方案7】:

              我们已经创建了另一个页面,该页面调用服务服务器端并写入响应(在我们的示例中为 .aspx)。我们清理了所有的HTML代码,doctype head body,制作服务端代码调用服务和response.编写。

              (在 aspx 的情况下,只需将页面指令留在顶部)

              这样你可以得到一个干净的字符串。

              顺便说一句,如果这会使我们的应用程序面临任何安全威胁或重大性能损失,我将非常感谢 cmets。 只是太忙了,没时间在这里问或搜索它:)

              【讨论】:

                【解决方案8】:

                您在方法声明中遗漏了唯一的“静态”关键字,请查看以下内容。

                仅供参考:所有的网络方法都应该是静态的

                [网络方法] [ScriptMethod(ResponseFormat = ResponseFormat.Json)]

                    public static string GetUserRoles(string JSONUserCode)
                    {
                        string retRoles = string.Empty;
                        List<JSONRole> roles = new List<JSONRole>();
                
                        {... I Populate the roles here ...}
                
                        DataContractJsonSerializer serializer = new
                        DataContractJsonSerializer(roles.GetType());
                        MemoryStream ms = new MemoryStream();
                        serializer.WriteObject(ms, roles);
                        string jsonString = Encoding.Default.GetString(ms.ToArray());
                        ms.Close();
                        return jsonString;
                    }
                

                【讨论】:

                  【解决方案9】:

                  不要在 WebMethod 中返回字符串,而是使用:

                  JavaScriptSerializer js = new JavaScriptSerializer();
                  Context.Response.Write(js.Serialize(YOUR_STRING_TO_OUTPUT));
                  

                  【讨论】:

                    猜你喜欢
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 2012-02-26
                    • 2023-04-05
                    • 1970-01-01
                    • 1970-01-01
                    • 2012-06-20
                    相关资源
                    最近更新 更多