2012-02-07 27 views
3

我有一個WCF服務部署到IIS 7和客戶端。我認爲該服務被配置爲處理併發。當我使用兩個客戶端進行測試時,花費了兩倍的時間。我花了幾個小時,但還沒有弄清楚我錯過了什麼。任何幫助/建議,將不勝感激。 Service1.svc.cs看起來是這樣的:WCF併發?

[ServiceBehavior(ConcurrencyMode = ConcurrencyMode.Multiple, InstanceContextMode = InstanceContextMode.PerCall)] 
[CallbackBehavior(UseSynchronizationContext=false)] 
public class Service1 : IService1 
{   
    public byte[] DownloadFile() 
    { 
     byte[] byt = File.ReadAllBytes(@"C:\Temp\TestFile.pdf"); 
     System.Threading.Thread.Sleep(1000); 
     return byt; 
    } 
} 

配置:

<system.net> 
    <connectionManagement> 
     <add address="*" maxconnection="100"/> 
    </connectionManagement> 
    </system.net> 
    <system.web> 
    <compilation debug="true" targetFramework="4.0" /> 
    <processModel autoConfig="false" maxWorkerThreads="1400" maxIoThreads="1400" minWorkerThreads="2"/> 
    <httpRuntime minFreeThreads="1000" minLocalRequestFreeThreads="1000"/> 
    </system.web> 
    <system.serviceModel> 
    <bindings> 
     <basicHttpBinding> 
     <binding name="Service1Binding" maxBufferSize="2147483647" maxBufferPoolSize="2147483647" 
      maxReceivedMessageSize="2147483647" transferMode="Streamed"> 
      <readerQuotas maxDepth="2147483647" maxArrayLength="2147483647" maxBytesPerRead="2147483647" /> 
     </binding> 
     </basicHttpBinding> 
    </bindings> 
    <services> 
     <service name="DocService.Service1">   
     <endpoint address="http://localhost/DocService/Service1.svc" binding="basicHttpBinding" 
      bindingConfiguration="" name="Service1Binding" bindingName="Service1Binding" 
      contract="DocService.IService1" /> 
     <endpoint address="http://localhost/DocService/mex" binding="mexHttpBinding" 
      name="mexpoint" contract="IMetadataExchange" /> 
     </service> 
    </services>  
    <behaviors> 
     <serviceBehaviors> 
     <behavior>   
      <serviceMetadata httpGetEnabled="true"/>   
      <serviceDebug includeExceptionDetailInFaults="false"/> 
      <serviceThrottling maxConcurrentCalls="100" maxConcurrentInstances="100" maxConcurrentSessions="100"/> 
     </behavior> 
     </serviceBehaviors> 
    </behaviors> 

Transfer TimeLine in Fiddler

+0

嗯 - 這應該工作。如果您註釋掉文件I/O調用,它會有所幫助嗎? – 2012-02-07 19:31:08

+0

好吧,就像你說的那樣,我做了其他不涉及I/O的調用,並且工作。我怎樣才能使它與I/O一起工作? – antar 2012-02-07 19:43:48

+0

可能與ReadAllBytes有關的文件保持打開一段時間的文件。如果您在每次通話中選擇不同的文件,它會有所作爲嗎? – 2012-02-07 19:47:19

回答

3

的請求正在遠遠長於1秒的睡眠時間和,比如讀取時間,10MB文件。他們應該完成也許1.1-2s這裏有點可疑。

註釋掉讀取並返回一個新的字節[0]。現在需要1.0s嗎?你現在有沒有併發?

編輯:你在用什麼客戶端?

編輯2:響應您的評論,文件傳輸不限制併發性。 WCF不關心你在服務方法中做了什麼。它對文件一無所知。問題是你的磁盤太慢了,而且序列化36mb也可能太慢了!你的服務器太慢了!你可以發現,如果通過用新字節[1024 * 1024 * 36]替換IO來解決磁盤或序列化問題。

+0

文件大小爲36 MB。這就是爲什麼它需要更長的時間。我正在使用控制檯客戶端。但是當我評論I/O操作時,它運作良好。如何使併發性與文件傳輸一起工作? – antar 2012-02-07 19:55:15

+2

我回復了編輯。 – usr 2012-02-07 19:59:28

+0

這些文件將被打開以供閱讀。他們不會互相阻攔。問題是,兩次讀取同一文件可能會將兩個操作的順序IO轉換爲磁盤驅動器上的隨機IO。 – usr 2012-02-07 20:20:57