2011-11-14 18 views
0

wsHttpBindingを使用してインターネット経由でDTOオブジェクトのリストを送信するのにかかる時間を短縮しようとしています。セキュリティは、X509証明書を持つTransportWithMessageCredentialです。リスト内の500個のオブジェクトの場合、時間は約2.5秒です。セキュリティを持たないbasicHttpBindingを使用すると、数ミリ秒しか保存されません。WCFのパフォーマンス転送wsHttpBindingを使用したオブジェクトのリスト

messageEncodingをMtomに変更すると、さらに遅くなるようです。私はトレースを追加し、svcTraceViewerを使用してファイルを表示し、メッセージが送信された後、最長の時間は "サーバーセキュリティセッションがクライアントからのクローズメッセージを受信しました"というアクティビティ境界があった後1.5秒でした。 400ms。

私は、次のコンテキストを追加していると並行性は、私は時間を短縮するために、データメンバーに名を追加した、DTOクラスでは、サービスクラス

[ServiceBehavior(InstanceContextMode = InstanceContextMode.PerSession,ConcurrencyMode=ConcurrencyMode.Multiple)] 

に属性をデシリアライズ

[Serializable] 
[DataContract(Name="Sample")] 
public class Sample 
{ 
    [DataMember(Name="Id")] 
    public int Id { get; set; } 

Web.Configファイルのサービスでは、動作は

<behaviors> 
    <serviceBehaviors> 
    <behavior name="MyBehavior"> 
     <dataContractSerializer maxItemsInObjectGraph="2147483647"/> 
     <serviceMetadata httpsGetEnabled="true" /> 
     <serviceDebug includeExceptionDetailInFaults="false" /> 
     <serviceThrottling maxConcurrentCalls="300" maxConcurrentSessions="5000" maxConcurrentInstances="300" /> 
    </behavior> 
    <behavior> 
     <serviceMetadata httpsGetEnabled="true" /> 
     <serviceDebug includeExceptionDetailInFaults="false" /> 
    </behavior> 
    </serviceBehaviors> 
</behaviors> 

クライアントWeb.Config hです。

<behavior name="MyBehavior"> 
       <dataContractSerializer maxItemsInObjectGraph="2147483647" /> 
       <clientCredentials> 
        <clientCertificate findValue="xxxxxxx" storeLocation="LocalMachine" x509FindType="FindByThumbprint" /> 
       </clientCredentials> 
      </behavior> 

を設定

<wsHttpBinding> 
    <binding name="MyEndpoint" 
      closeTimeout="00:01:00" 
      openTimeout="00:01:00" 
      receiveTimeout="00:10:00" 
      sendTimeout="00:01:00" 
      bypassProxyOnLocal="false" 
      transactionFlow="false" 
      hostNameComparisonMode="StrongWildcard" 
      maxBufferPoolSize="524288" 
      maxReceivedMessageSize="2147483647" 
      messageEncoding="Mtom" 
      textEncoding="utf-8" 
      useDefaultWebProxy="false" 
      allowCookies="false" > 
     <readerQuotas 
      maxDepth="2147483647" 
      maxStringContentLength="2147483647" 
      maxArrayLength="2147483647" 
      maxBytesPerRead="2147483647" 
      maxNameTableCharCount="2147483647" /> 
     <reliableSession 
      ordered="true" 
      inactivityTimeout="00:10:00" 
      enabled="false" /> 
     <security mode="TransportWithMessageCredential"> 
     <transport 
      clientCredentialType="None" /> 
     <message 
      clientCredentialType="Certificate" /> 
     </security> 
    </binding> 
    </wsHttpBinding> 

と行動の結合は、任意の提案は、これは、高速かつスケーラブルであることを取得する方法があるので?

解決策 私たちが想定していたようにgzipは実際にIISにインストールされていないことが判明しました。私は間違いなく、生産のためのMarc Gravellのprotobuf-netをテストしていますが、gzipはすぐに問題を解決しました。

+0

オブジェクトの大きさはどれくらいですか?データはどれくらいの量のデータとなりますか?これはローカルかリモートですか。ユーザーはどのくらい遠いですか? –

+0

これは、インターネットのWindows 2008 r2サーバーのiis 7クライアントとサーバーの両方です。私はデータサイズを測定していないが、これを最も良くするだろうか?オブジェクトは18文字列とintフィールドで、各オブジェクトはメッセージxmlの約900文字です。 –

答えて

2

GZip圧縮を使用すると、多くのメリットが得られます。

1

帯域幅の時間とシリアライズ/デシリアライゼーションの時間がここ因子である可能性があります。また、トランスポートセキュリティの時間は、帯域幅のサイズにほぼ関係します。私はあなたがここで見ることができる1つのことが帯域幅の時間を削減することをお勧めします。免責事項:私は作者です(しかし、私は何も売っていません)。しかし、protobuf-netはというデータフォーマットをDataContractSerializerより高密度にし、WCFに接続してシリアライザ。これを使用する場合、となり、理想的にはバイナリなのでMTOMを有効にします。これは明示的にまたはvia configurationのいずれかで行うことができます。 2つの端がアセンブリ共有を使用している場合は最も簡単です。クライアントの半分を生成するために "mex"を使用している場合は、いくつかの追加ステップが含まれている可能性があります。

+0

ありがとうMarc、私はprotobuf-netに行きます。私はおそらくmexを使用していますが、私は両端を制御するので、アセンブリの共有を見ます。 –

+0

@Paulすべてのシナリオに役立つとは保証できませんが、通常は良い仕事をします –

関連する問題