C# 收缩从WebMethods返回的ASP.NET 3.5 XML文档的选项
我继承了一个ASP.NET(.NET 3.5)web应用程序和相应的C#client组件以及一个相关的javascript客户端 服务器端组件使用默认的[WebMethod]序列化,并且,考虑到一些XML文档的大小(以及元素名称的详细程度),我对缩小返回文档大小的选项感到好奇 我对二进制XML、自定义XML序列化(例如,将此VeryLanglementNamewhichshowsupalot更改为更短的名称)、简单压缩、移动到JSON等持开放态度。我们确实有相当数量的单独WebMethods和返回的不同对象,因此,理想的解决方案是在方程的两边尽可能少地改变 我知道在做压缩或自定义序列化之类的事情时会有CPU/带宽的权衡,所以我想在不构建大量代码的情况下对一些选项进行基准测试C# 收缩从WebMethods返回的ASP.NET 3.5 XML文档的选项,c#,asp.net,json,serialization,webmethod,C#,Asp.net,Json,Serialization,Webmethod,我继承了一个ASP.NET(.NET 3.5)web应用程序和相应的C#client组件以及一个相关的javascript客户端 服务器端组件使用默认的[WebMethod]序列化,并且,考虑到一些XML文档的大小(以及元素名称的详细程度),我对缩小返回文档大小的选项感到好奇 我对二进制XML、自定义XML序列化(例如,将此VeryLanglementNamewhichshowsupalot更改为更短的名称)、简单压缩、移动到JSON等持开放态度。我们确实有相当数量的单独WebMethods和返
有人能告诉我相关的文档或IIS/VS.NET选项来配置以探索这些折衷吗?我最近测试了IIS压缩,并对结果感到满意,因为我知道了如何设置压缩级别。最终结果是196 kb的JSON结果压缩到13.6 kb 下面是我为自己做的一些关于设置动态压缩和设置压缩级别的注释。我道歉,如果他们是粗糙的,因为我做他们主要是为了我自己的未来参考 此外,我肯定会建议尝试使用JSON而不是XML,因为它提供了更紧凑的结果。我没有具体的数字,但我记得JSON比XMl小50%左右
如有必要,安装动态压缩系统 Windows7:
下,添加以下元素:None: 196,416 bytes
Level 0: 35,234
Level 1: 29,219
Level 4: 18,461
Level 9: 13,638
您可以使用告诉ASPNET如何序列化的属性来装饰类、属性和方法。对于生成“更小”的XML,您有几个选项:
- 对于具有VeryLongNames的属性,请使用
属性并指定一个较短的替代名称。任何短元素名都可以,只要确保它是唯一的。请记住,这会降低可读性。XML旨在让人可读,以便于处理[xmlement]
有明确的含义,而19820
没有明确的含义19820
- 如果您不介意使用混合模型,可以将一些简单数量序列化为属性而不是元素。例如,对于42的简单整数值,要序列化为属性的文本是
,而要序列化为元素的文本是PropName='42'
。因此,无论名称的长度如何,都可以将大小几乎减半。有些人坚决反对序列化为xml属性。我一直不明白为什么会这样,所以我认为这是压缩xml的好方法42
- 有一些将数组序列化为XML的选项。使用XmlArrayItem为数组生成较小的形式。看
除了使用属性之外,还有一些其他的事情你可以考虑…p>
- 检查XML消息,以确保仅序列化所需的内容,并且序列化的内容不会以低效的方式进行序列化。例如,如果您正在传输一个32k二进制图像,那么最好传输一个HTTP URL,并让应用程序执行额外的请求以获取图像,而不是将图像打包到XML信封中。或者,使用MTOM而不是XML序列化
- 考虑优化一些消息。您总是需要序列化所有内容吗?您能否参数化您的webmethods以允许调用者在每次答复中询问更多或更少的详细信息
- 您是否有效地使用XML名称空间?不要无缘无故地使用多个名称空间。它只会增加消息的大小和复杂性。另一方面,如果您有充分的理由使用多个xml名称空间,请不要为了节省空间而放弃这些理由
- 考虑是否值得花费时间和精力优化XML负载大小。真正的回报是什么?如果您花费4周的时间进行优化和测试以获得4%的吞吐量,那么值得吗?通过简单地扩展或优化您的网络布局,您能做得更好吗
C:\Windows\System32\Inetsrv\Appcmd.exe
set config -section:httpCompression
-[name='gzip'].staticCompressionLevel:9
-[name='gzip'].dynamicCompressionLevel:4
None: 196,416 bytes
Level 0: 35,234
Level 1: 29,219
Level 4: 18,461
Level 9: 13,638