使用WSE 3.0 MTOM服务避免GC颠簸

时间:2010-05-20 08:22:10

标签: c# wcf web-services

由于历史原因,我有一些WSE 3.0 Web服务,我无法在服务器端升级到WCF(这也是一项大量的工作)。

这些Web服务用于使用MTOM编码从客户端到服务器的文件传输。出于兼容性的原因,这也不能在短期内改变。其次,它们是从Java和.NET调用的,因此需要跨平台,因此需要MTOM。

工作原理是客户端调用“上传”WebMethod,一次发送一大块数据,因为传输的文件大小可能是千兆字节。

但是,由于在调用WebMethod之前无法控制堆栈的某些部分,因此无法控制Web服务的内存使用模式。

我遇到的问题是文件大小从50MB左右开始,性能因GC而绝对被杀死,因为看起来WSE 3.0缓冲了从一个新的byte []数组中的客户端接收的每个块,并且当我们完成50MB的时候,我们花了20-30%的时间来做GC。

我玩过各种大小,从16k到2MB,结果没有太大差异。

圆形跳闸所涉及的延迟会导致较小的块被杀死,较大的块只会推迟放缓直到GC启动。

关于减少WSE创造的垃圾的任何好主意?我可以通过某种方式插入管道,并对可以访问客户端请求流并将其流式传输到WebMethod的东西进行评审吗?

我知道可以使用WSE“流式传输”对客户端的响应(尽管非常难看),但这个问题是来自客户端的请求。

2 个答案:

答案 0 :(得分:1)

你完成了。技嘉转移和WSE 3.0从未合作过 - 你基本上需要在WCF中进行流式传输。

你可以尝试使用64位进程并加载大量内存,这样GC就不是问题了。升级到.NET 4.0(主要应该是无痛的)并使用非阻塞GC。使用12-30gb的内存来完成这个过程,你应该再活一次。

历史上,所有ASP(.net)内容都是“批处理”,首先收集所有数据,然后发送它。这意味着大件物品处理得不好。

答案 1 :(得分:0)

作为一种解决方法,经过一些测试后,似乎可以在同一个Web应用程序中同时使用WCF服务和旧式ASMX Web服务,这两个服务器都具有.asmx扩展名,这将允许我实现文件传输Web使用流式传输在WCF中进行服务,并保持其余服务不变,并保留人们用于连接的原始URI。

它需要一些真正的丑陋 BuildProvider和IHttpHandler黑客攻击,但它确实有效。

简而言之:

  1. 您实现了一个代理构建提供程序,它检查.asmx文件以确定它是WebService还是ServiceHost声明。然后,您可以在相关的实际构建提供程序(System.ServiceModel.Activation.ServiceBuildProviderSystem.Web.Compilation.WebServiceBuildProvider)上调用相应的方法。请注意,您必须使用反射来实例化目标构建提供程序,因为它们是内部的。您还可以调用一些内部BuildProvider方法来模拟BuildManager所做的事情。

  2. 您实现IHttpHandlerFactory创建System.ServiceModel.Activation.HttpHandler使用反射(因为它也是内部的),或者使用方便的,已公开的System.Web.Services.Protocols.WebServiceHandlerFactory来创建旧版ASMX IHttpHandler

  3. 您可以按如下方式配置它们(假设您在IIS7上使用非集成模式):

  4. <?xml version="1.0"?>
    <system.web>
        <compilation debug="true">
          <buildProviders>
            <remove extension=".asmx" />
            <add extension=".asmx" type="TestService.AsmxWcfSwitchingBuildProvider, TestService, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null"/>
          </buildProviders>
        </compilation>
        <httpHandlers>
          <remove verb="*" path="*.asmx"/>
          <add path="*.asmx" verb="*" type="TestService.AsmxWcfSwitchingHttpHandlerFactory, TestService, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" validate="false"/>
        </httpHandlers>
      </system.web>
    

    1. 导航到旧版ASMX页面。验证您是否可以看到默认页面和WSDL。

    2. 导航到WCF ASMX页面。验证您是否可以看到默认页面和WSDL。

    3. 确保您与原始WSDL保持一致,并确保您的SOAP操作正确等等,留给读者练习:)