2010-05-20 61 views
1

由於歷史原因,我有一些WSE 3.0 Web服務,我無法在服務器端升級到WCF(這也是相當大的工作量)。避免使用WSE 3.0 MTOM服務進行GC抖動

這些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

此外,在IIS7使用經典模式是不好的:) – 2010-05-21 10:59:22

回答

1

你完成了。技嘉傳輸和WSE 3.0從來沒有一起工作 - 你基本上需要在WCF中進行流式傳輸。

你可以只嘗試去64位與過程,並使得GC與其說是一個問題加載噸的內存。升級到.NET 4.0(主要應該是無痛的)並使用非阻塞GC。用12-30gb的內存擊中過程,你應該再活一點。

歷史上所有ASP(.net)的東西都是「批處理」的,首先收集所有數據然後發送它。這意味着大件物品處理得不好。

0

作爲一種變通方法,經過一些測試,它似乎可以有兩個WCF服務和舊式ASMX Web服務在同一Web應用程序,都與.asmx擴展,這將讓我實現WCF文件傳輸Web服務使用流媒體,並保持其他服務不變,並保留人們用於連接的原始URI。

它需要一些真實的醜陋 BuildProvider和IHttpHandler黑客入侵,但它確實有效。

簡而言之:

  1. 您實現巡檢.asmx文件,以確定它是否是一個WebService或ServiceHost的聲明代理生成提供。然後調用對有問題(System.ServiceModel.Activation.ServiceBuildProviderSystem.Web.Compilation.WebServiceBuildProvider)的實際生成提供適當的方法。請注意,您必須使用反射實例化目標構建提供程序,因爲它們是內部的。您也可以撥打一些內部BuildProvider方法來效仿BuildManager一樣。

  2. 您實現創建無論是System.ServiceModel.Activation.HttpHandler使用反射(因爲它也是內部),或使用便捷,已經公開System.Web.Services.Protocols.WebServiceHandlerFactory創建一個傳統的ASMX的IHttpHandler的IHttpHandlerFactory

  3. 您配置它們如下(假定使用的是上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的行動是正確的,等等,就留給讀者做練習:)