ASP.NET JSON Web服务始终返回包含在XML中的JSON响应

问题描述 投票:12回答:9

我看到了类似的问题,但它没有解决我的问题。我在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
9个回答
12
投票

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

此外,您不应该手动将对象序列化为JSON,而是返回角色,如果您的客户端请求数据为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


3
投票

事实证明,这不是数字类型

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

它就像一个魅力。


1
投票

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


1
投票

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


1
投票

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

如果您已经开发了这样的一百个服务,可以为您解决:只需创建一个aspx,ServiceCaller.aspx,删除html中的所有内容,只需保留页面指令并使用codebehind来调用服务和Response.Write字符串。同时将Service方法名称作为“HelloWorld”之类的参数,并使用反射来调用它。

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

(欢迎任何评论:)


1
投票

像这样使用不返回字符串类型。只需写

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

0
投票

我们创建了另一个调用服务服务器端并写入响应的页面(在我们的例子中是.aspx)。我们清理了所有HTML代码,doctype head body,并使服务器端代码调用服务并响应。编写它。

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

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

顺便说一句,如果这使我们的应用程序暴露于任何安全威胁或主要性能命中,我真的很感激这些评论。太忙了,不能在这里问它或搜索它:)


0
投票

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

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

[WebMethod] [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;
    }

0
投票

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

JavaScriptSerializer js = new JavaScriptSerializer();
Context.Response.Write(js.Serialize(YOUR_STRING_TO_OUTPUT));
© www.soinside.com 2019 - 2024. All rights reserved.