Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/30.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 收缩从WebMethods返回的ASP.NET 3.5 XML文档的选项_C#_Asp.net_Json_Serialization_Webmethod - Fatal编程技术网

C# 收缩从WebMethods返回的ASP.NET 3.5 XML文档的选项

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和返

我继承了一个ASP.NET(.NET 3.5)web应用程序和相应的C#client组件以及一个相关的javascript客户端

服务器端组件使用默认的[WebMethod]序列化,并且,考虑到一些XML文档的大小(以及元素名称的详细程度),我对缩小返回文档大小的选项感到好奇

我对二进制XML、自定义XML序列化(例如,将此VeryLanglementNamewhichshowsupalot更改为更短的名称)、简单压缩、移动到JSON等持开放态度。我们确实有相当数量的单独WebMethods和返回的不同对象,因此,理想的解决方案是在方程的两边尽可能少地改变

我知道在做压缩或自定义序列化之类的事情时会有CPU/带宽的权衡,所以我想在不构建大量代码的情况下对一些选项进行基准测试


有人能告诉我相关的文档或IIS/VS.NET选项来配置以探索这些折衷吗?

我最近测试了IIS压缩,并对结果感到满意,因为我知道了如何设置压缩级别。最终结果是196 kb的JSON结果压缩到13.6 kb

下面是我为自己做的一些关于设置动态压缩和设置压缩级别的注释。我道歉,如果他们是粗糙的,因为我做他们主要是为了我自己的未来参考

此外,我肯定会建议尝试使用JSON而不是XML,因为它提供了更紧凑的结果。我没有具体的数字,但我记得JSON比XMl小50%左右


如有必要,安装动态压缩系统

Windows7:

  • 进入开始>控制面板>程序和功能,打开程序和功能控制台
  • 单击“打开或关闭Windows功能”
  • 在对话框中,展开Internet信息服务>万维网服务>性能功能,然后启用动态内容压缩
  • 单击“确定”
  • Windows Server 2008:

  • 进入“启动>所有程序>管理工具>服务器管理器”,打开服务器管理器控制台
  • 在服务器管理器树视图中,展开角色,然后单击Web服务器(IIS)
  • 在主窗口中,向下滚动到“角色服务”面板,然后单击“添加角色服务”
  • 在“选择角色服务”对话框中,单击并启用Web服务器(已安装)>性能(已安装)>动态内容压缩
  • 单击下一步
  • 在确认安装选择屏幕上,单击安装
  • 在IIS中启用动态压缩

  • 在IIS管理应用程序中,选择服务器,然后在IIS功能组中,双击“压缩”
  • 选中“启用动态内容压缩”
  • 启用“应用程序/json”和“应用程序/xml”

  • 在c:\Windows\System32\inetserv\config中找到applicationHost.config文件
  • 编辑它并找到httpCompression元素
  • 下,添加以下元素:
  • 查看这些网站了解更多详细信息:

    我对json响应的初始测试:

    None:          196,416 bytes
    Level 0:        35,234
    Level 1:        29,219
    Level 4:        18,461
    Level 9:        13,638
    

    您可以使用告诉ASPNET如何序列化的属性来装饰类、属性和方法。对于生成“更小”的XML,您有几个选项:

    • 对于具有VeryLongNames的属性,请使用
      [xmlement]
      属性并指定一个较短的替代名称。任何短元素名都可以,只要确保它是唯一的。请记住,这会降低可读性。XML旨在让人可读,以便于处理
      19820
      有明确的含义,而
      19820
      没有明确的含义

    • 如果您不介意使用混合模型,可以将一些简单数量序列化为属性而不是元素。例如,对于42的简单整数值,要序列化为属性的文本是
      PropName='42'
      ,而要序列化为元素的文本是
      42
      。因此,无论名称的长度如何,都可以将大小几乎减半。有些人坚决反对序列化为xml属性。我一直不明白为什么会这样,所以我认为这是压缩xml的好方法

    • 有一些将数组序列化为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