• WebService返回JSON格式(转载)


    原文地址:https://www.cnblogs.com/liweis/p/12594202.html

    WebService是基于XML格式的,返回的默认结果是XML格式,因为它比较通用,几乎任何编程语言、操作系统和应用程序都能方便的读写。

    多番测试

    方式一:最简单的例子:

    1
    2
    3
    4
    5
    6
    [WebMethod(MessageName = "默认返回对象")]
    public User GetXmlByObject()
    {
        User user = new User() {Id = 1, Name = "张三"};
        return user;
    }

     返回结果:

    1
    2
    <?xml version="1.0" encoding="UTF-8"?>
    <User xmlns="http://tempuri.org/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"><Id>1</Id><Name>张三</Name></User>

     方式二:WebService的输入或输出参数可以是对象,它会自动序列化XML格式,如果自己强加序列化一次,返回字符串,结果就是这样:

    1
    2
    3
    4
    5
    6
    [WebMethod(MessageName = "构造XML返回")]
    public string GetXmlByXml()
    {
        User user = new User() { Id = 2, Name = "张三丰" };
        return SerializeToXml(user);
    }

    返回结果:

    1
    2
    <?xml version="1.0" encoding="UTF-8"?>
    <string xmlns="http://tempuri.org/"><?xml version="1.0" encoding="utf-8"?><User xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"><Id>2</Id><Name>张三丰</Name></User></string>

     方式三:随着JSON的流行,更多的网页、移动端都需要JSON格式。于是,就把它序列化JSON串返回(我一直都是这样操作的)

    1
    2
    3
    4
    5
    6
    7
    [WebMethod(MessageName = "构造JSON返回")]
    public string GetXmlByJson()
    {
        User user = new User() { Id = 3, Name = "李四" };
        //添加Newtonsoft.Json进行序列化
        return JsonConvert.SerializeObject(user);
    }

    返回结果:

    1
    2
    <?xml version="1.0" encoding="UTF-8"?>
    <string xmlns="http://tempuri.org/">{"Id":3,"Name":"李四"}</string>

     方式四:如果将对象反序列化成JSON字符串,返回包含json字符串的XML格式,前端总要有一个解析过程,不是很方便!有没有返回直接是JSON格式的?有。

    1
    2
    3
    4
    5
    6
    7
    [WebMethod(MessageName = "Response.Write")]
    public void GetXmlByResponse()
    {
        User user = new User() { Id = 4, Name = "李世民" };
        Context.Response.Write(JsonConvert.SerializeObject(user));
        Context.Response.End();
    }

    返回结果:

    1
    {"Id":4,"Name":"李世民"}

    解决方案

    上面最后一 种测试虽然能达到效果,但每个接口中都要这样操作,显得有点"笨",当然想要高级的自行车。

    第一步,在工程中新建AsmxRequestModule.cs和CatchTextStream.cs文件,并实现它。

    AsmxRequestModule代码如下:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    public class AsmxRequestModule: IHttpModule
    {
        public void Init(HttpApplication context)
        {
            context.BeginRequest += new EventHandler(Application_BeginRequest);
        }
     
        public void Dispose()
        {
        }
     
        public void Application_BeginRequest(object sender, EventArgs e)
        {
            HttpApplication application = sender as HttpApplication;
            string extension = Path.GetExtension(application.Request.Path);
            if (application.Request.Path.IndexOf(".asmx/") > -1)
            {
                application.Response.Filter = new CatchTextStream(application.Response.Filter);
            }
        }
    }

    CatchTextStream代码如下:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    public class CatchTextStream: Stream
    {
        #region 数据流
        /// <summary>
        /// 数据流
        /// </summary>
        private readonly Stream output;
        #endregion
        #region 构造函数
        public CatchTextStream(Stream s)
        {
            output = s;
        }
        #endregion
        #region 重载属性及方法
        public override bool CanRead => output.CanRead;
     
        public override bool CanSeek => output.CanSeek;
     
        public override bool CanWrite => output.CanWrite;
     
        public override void Flush()
        {
            output.Flush();
        }
        public override long Length => output.Length;
     
        public override long Position
        {
            get => output.Position;
            set => output.Position = value;
        }
        public override int Read(byte[] buffer, int offset, int count)
        {
            return output.Read(buffer, offset, count);
        }
        public override long Seek(long offset, SeekOrigin origin)
        {
            return output.Seek(offset, origin);
        }
        public override void SetLength(long value)
        {
            output.SetLength(value);
        }
        public override void Write(byte[] buffer, int offset, int count)
        {
            if (HttpContext.Current != null)
            {
                HttpContext context = HttpContext.Current;
                Encoding encoding = context.Response.ContentEncoding;
                string responseInfo = encoding.GetString(buffer, offset, count);
                responseInfo = responseInfo.Replace("<?xml version=\"1.0\" encoding=\"utf-8\"?>\r\n<string xmlns=\"http://tempuri.org/\">""");
                responseInfo = responseInfo.Substring(0, responseInfo.Length - 9);
                buffer = encoding.GetBytes(responseInfo);
                output.Write(buffer, 0, buffer.Length);
            }
        }
        #endregion
    }

    第二步,修改web.config ,在配置中增加modules配置。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    <configuration>
      ……
     <system.webServer>
        ……
        <modules>
          <add name="AsmxRequestModule" type="命名空间.AsmxRequestModule"/>
        </modules>
        ……
      </system.webServer>
      ……
    </configuration>

     第三步,按“构造JSON对象”(第三种)的方式书写接口即可。

  • 相关阅读:
    优先队列
    Problem W UVA 662 二十三 Fast Food
    UVA 607 二十二 Scheduling Lectures
    UVA 590 二十一 Always on the run
    UVA 442 二十 Matrix Chain Multiplication
    UVA 437 十九 The Tower of Babylon
    UVA 10254 十八 The Priest Mathematician
    UVA 10453 十七 Make Palindrome
    UVA 10163 十六 Storage Keepers
    UVA 1252 十五 Twenty Questions
  • 原文地址:https://www.cnblogs.com/shuaimeng/p/16224771.html
Copyright © 2020-2023  润新知