2011-01-17 14 views
2

TransferModeを "Streaming"に設定してwcf basicHttpBindingを有効にしました。
問題は、クライアント側のストリームから読み取り操作を行うたびに、正確に1536バイト(イーサネットフレーム)を読み取ることになります。
一度に大きなパケットのデータを送信するためにwcfサービスを取得するにはどうすればよいですか?Wcf非常に小さいパケットサイズ

EDIT

だから、明らかにデフォルトBytesPerReadは、しかし、私は、クライアントとサーバーの両方でその値を変更した、4096です。ここでの設定ファイルまた

があり、私は同じ問題
WCF maxBytesPerRead limit to 4096

サーバー SERVERで扱っ未回答の投稿を見つけた

(私は2つのエンドポイントを持っていることに注意してください、1は、コンテンツをダウンロードするためであります、私は)私の質問にbasicHttpBindingエンドポイントを参照していますbasicHttpBindingにし、一つの通信がws2007HttpBindingを使用するためである

<system.serviceModel> 
<bindings> 
    <basicHttpBinding> 
    <binding name="MyBasicHttpBinding" allowCookies="true" maxBufferSize="955366" 
    maxBufferPoolSize="964285" maxReceivedMessageSize="955556" messageEncoding="Mtom" 
    transferMode="Streamed"> 
    <readerQuotas maxDepth="60" maxStringContentLength="955556" maxArrayLength="955556" 
    maxBytesPerRead="955556" maxNameTableCharCount="955556" /> 
    </binding> 
    </basicHttpBinding> 
    <ws2007HttpBinding> 
    <binding name="MyBinding" allowCookies="false"> 
    <security mode="None" /> 
    </binding> 
    </ws2007HttpBinding> 
</bindings> 
<services> 
    <service behaviorConfiguration="ContentManagementServiceBehavior" 
    name="App_Code.Services.ContentManagement.ContentManagementService"> 
    <clear /> 
    <endpoint address="mex" binding="mexHttpBinding" name="mex" contract="IMetadataExchange" 
    listenUriMode="Explicit" /> 
    <endpoint binding="ws2007HttpBinding" bindingConfiguration="MyBinding" 
    name="ws2007Endpoint" contract="App_Code.Services.ContentManagement.IContentManagementService" 
    listenUriMode="Explicit" /> 
    <endpoint address="/download" binding="basicHttpBinding" bindingConfiguration="MyBasicHttpBinding" 
    name="basicHttpBinding" contract="App_Code.Services.ContentManagement.IContentManagementDownlodService" /> 
    <host> 
    <baseAddresses> 
    <add baseAddress="/Services/ContentManagement/ContentManagementService.svc" /> 
    </baseAddresses> 
    </host> 
    </service> 
</services> 
     <behaviors> 
    <serviceBehaviors> 
    <behavior name="ContentManagementServiceBehavior"> 
    <serviceMetadata httpGetEnabled="true" /> 
    <serviceDebug includeExceptionDetailInFaults="true" /> 
    </behavior> 
    </serviceBehaviors> 
</behaviors> 
     <serviceHostingEnvironment aspNetCompatibilityEnabled="true" multipleSiteBindingsEnabled="true"/> 
    </system.serviceModel> 

CLIENT

<system.serviceModel> 

    <bindings> 

    <basicHttpBinding> 

    <binding name="basicHttpBinding" closeTimeout="00:10:00" openTimeout="00:10:00" 

    receiveTimeout="00:10:00" sendTimeout="00:10:00" allowCookies="false" 

    bypassProxyOnLocal="false" hostNameComparisonMode="StrongWildcard" 

    maxBufferPoolSize="92429000" maxReceivedMessageSize="65536000" messageEncoding="Mtom" 

    textEncoding="utf-8" transferMode="Streamed" useDefaultWebProxy="true"> 

    <readerQuotas maxDepth="90" maxStringContentLength="65536000" maxArrayLength="65536000" 

     maxBytesPerRead="655360" maxNameTableCharCount="65536000" /> 

    <security mode="None" /> 

    </binding> 

    </basicHttpBinding> 

    <wsHttpBinding> 

    <binding name="ws2007Endpoint" closeTimeout="00:01:00" openTimeout="00:01:00" 

    receiveTimeout="00:10:00" sendTimeout="00:01:00" bypassProxyOnLocal="false" 

    transactionFlow="false" hostNameComparisonMode="StrongWildcard" 

    maxBufferPoolSize="524288646" maxReceivedMessageSize="65536646" 

    messageEncoding="Text" textEncoding="utf-8" useDefaultWebProxy="true" 

    allowCookies="false"> 

    <readerQuotas maxDepth="32" maxStringContentLength="819264564" 

     maxArrayLength="163846764" maxBytesPerRead="40964543" maxNameTableCharCount="16384564" /> 

    <reliableSession ordered="true" inactivityTimeout="00:10:00" 

     enabled="false" /> 

    <security mode="None"> 

     <transport realm="" /> 

    </security> 

    </binding> 

    </wsHttpBinding> 

    </bindings> 

    <client> 

    <endpoint address="<absolute address>" 

    binding="wsHttpBinding" bindingConfiguration="ws2007Endpoint" 

    contract="ContentManagementServiceReference.IContentManagementService" 

    name="ws2007Endpoint" /> 

    <endpoint address="<absolute address>" 

    binding="basicHttpBinding" bindingConfiguration="basicHttpBinding" 

    contract="ContentManagementServiceReference.IContentManagementDownlodService" 

    name="basicHttpBinding" /> 

    </client> 

</system.serviceModel> 
+0

大きなパケットはおそらくちょうど断片化されますが。 1536バイトごとにいくつかのパッケージに分割されます。あなたのネットワークがより大きなパッケージを扱うことができるでしょうか? – sisve

+0

WebRequestsを使用して、より高速で大きなチャンクでファイルをダウンロードし、アップロードしたプロジェクトでもそうだと思います。私は約1.2MB /秒の速度で約300〜500kb/sのファイルを、私のサービスがホストされているサーバーから直接ダウンロードすることができます。このような小さなデータ(4096 bytesPerRead)のダウンロード速度は、接続速度が極端に遅い15-30 kb/sです。 – dortzur

答えて

0

は、このスレッドで見てみましょう:http://social.msdn.microsoft.com/forums/en-US/wcf/thread/e1f7b040-39a8-4ca8-9def-96b2b47c0d6f/

カップルのオプションは、私はあなたの問題のために良いフィットになると思うことがあります。

ありがとう、

Roberto

+0

スレッドが問題に適合しましたが、エンコードをMtomに変更するとパケットサイズが4096バイトに変更されました。これはバイナリバインディングを使用せずに期待できる最大のサイズですか? – dortzur

+0

4096はデフォルト値に過ぎず、これを増やすことはできますが、ビデオをストリーミングする複数のプロセス(複数のクライアント)がある場合、バッファサイズを増やすとCPUリソースの問題(具体的にはメモリ)になることがあります。 – Roberto

+0

これを増やすことはできませんが、実際に試してみましたか?私はそれを正確に行うための基本的な例を書いた。私の知見はテキストのエンコンディングで最大1536です。私が得る最大のMtomエンコーディングは4096です(IIS上のWCFホスティング)。 – joedotnot

0

あなたはmaxBytesPerReadプロパティ変更しようとすることができます

<bindings> 
    <basicHttpBinding> 
     <binding name="Streamed" TransferMode="Streamed" TextEncoding="Mtom" 
      maxMessageReceivedSize="4000000"> 
      <readerQuotas mexBytesPerRead="8192" /> 
     </binding> 
    </basicHttpBinding> 
</bindings> 
+0

既にmaxBytesPerRead = "655360"に設定されています。私はwcfエディタを使ってすべてのバインディングフィールドで本当に高い数字を使用しましたが、何もしていないようです。読書はまだ4096バイトで止まっています。 – dortzur

+0

@dortzur:クライアントの設定を変更しましたか? –

+0

ええ、クライアントとサーバーの両方が非常に高い数に設定されています。 wcf-editorに表示されていないフィールドがない限り、それらはすべて非常に高いです。私はこの振る舞いにかなり困惑しています。 – dortzur

関連する問題