由于历史原因,我有一些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“流式传输”对客户端的响应(尽管非常难看),但这个问题是来自客户端的请求。
答案 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黑客攻击,但它确实有效。
简而言之:
您实现了一个代理构建提供程序,它检查.asmx
文件以确定它是WebService还是ServiceHost声明。然后,您可以在相关的实际构建提供程序(System.ServiceModel.Activation.ServiceBuildProvider
或System.Web.Compilation.WebServiceBuildProvider
)上调用相应的方法。请注意,您必须使用反射来实例化目标构建提供程序,因为它们是内部的。您还可以调用一些内部BuildProvider
方法来模拟BuildManager
所做的事情。
您实现IHttpHandlerFactory
创建System.ServiceModel.Activation.HttpHandler
使用反射(因为它也是内部的),或者使用方便的,已公开的System.Web.Services.Protocols.WebServiceHandlerFactory
来创建旧版ASMX IHttpHandler
您可以按如下方式配置它们(假设您在IIS7上使用非集成模式):
<?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>
导航到旧版ASMX页面。验证您是否可以看到默认页面和WSDL。
导航到WCF ASMX页面。验证您是否可以看到默认页面和WSDL。
确保您与原始WSDL保持一致,并确保您的SOAP操作正确等等,留给读者练习:)