2012-02-07 21 views
3

IIS 7とクライアントにWCFサービスを展開しました。サービスが並行処理を処理するように設定されていると思いました。 2人のクライアントでテストしたところ、2倍の時間がかかりました。私は何時間も費やしていますが、私がそれを見逃した場所を見つけ出すことはまだできません。どんな助力/提案も感謝します。 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

Hmm - これはうまくいくはずです。ファイルI/Oコールをコメントアウトすると違いがありますか? –

+0

あなたが言ったように、私はI/Oを伴わない他の呼び出しを行い、うまくいきました。 I/Oでどのように動作させることができますか? – antar

+0

ReadAllBytesとの関係は、ファイルをしばらく開いたままにすることがあります。各呼び出しで異なるファイルを選択すると違いがありますか? –

答えて

3

要求は1秒睡眠時間と言うの読み出し時間、10メガバイトのファイルよりもはるかに長く取っています。おそらく1.1-2秒で完了するはずです。

新しいバイト[0]を読み出して返します。今は1.0秒かかりますか?あなたは今並行処理をしていますか?

編集:どのクライアントを使用していますか?

編集2:あなたのコメントに応じて、ファイル転送は何らかの形で並行性を制限していません。 WCFはあなたのサービス方法の中であなたが何をしているか気にしません。それはファイルについて何も知らない。問題は、あなたのディスクが遅すぎることと、シリアル化することが36mbもおそらく遅いことです!サーバーが遅すぎます! IOを新しいバイト[1024 * 1024 * 36]に置き換えることによって、ディスクまたはシリアライズが問題であるかどうかを知ることができます。

+0

ファイルサイズは36 MBです。だから、それは時間がかかります。私はコンソールクライアントを使用しています。しかし、私がI/O操作をコメントするとき、それは働いた。ファイル転送で並行処理を動作させるにはどうすればよいですか? – antar

+2

私は編集で応えました。 – usr

+0

ファイルは読み込み用に開かれます。彼らはお互いをブロックしません。問題は、同じファイルを2回読み取ると、両方の操作の順次IOがディスクドライブのランダムIOになる可能性があるということです。 – usr