WCFクライアント - WCFサービスから返されたストリームの最初の255バイトのみが値を含む

StackOverflow https://stackoverflow.com/questions/3695541

質問

WindowsサービスがホストするWCFサービスと通信するASP.NET WebFormsアプリケーションの世話をするように任されました。サービスに使用されるバインディングは、nettcpbindingです。

このサービスは、「ファイル」をアップロードおよびダウンロードするための方法を公開します。ユーザーはファイルをアップロードするために選択し、httppostfile.inputSteamは、サービス「アップロード」メソッドのパラメーターとしてサービスに直接渡されます。このサービスは、データベースのバイト配列としてストリームを保存します[データベースフィールドデータ型はVarbinary(MAX)]です。

ファイルのダウンロードデータフローは、基本的に逆のプロセスです。バイトはデータベースから取得されます。 WCFサービスのメモリストリームにロードされました。その後、Webアプリケーションに戻りました。

上記の操作の各ステップでストリーム(送信 /受信)に含まれるデータをキャプチャしました - クライアント(Webアプリ)とサービスで。私はループし、各ストリームに含まれるバイトをフラットファイルに書き留めました。

それぞれの場合のバイト配列は同一です[バイト値。ファイルのダウンロード操作を除き、ストリーム内のバイト数]。ストリームがWCFサービスからWebアプリケーションに返される時点で。ここでは、受信したバイトの数は正しいですが、最初の255バイトのみが入力されます。残りのバイトの値はゼロです

私は、問題がここにある必要があると信じているため、拘束力のある値に多くの実験的な変更を加えました - サービスの両方のクライアントの両方で - 。現在まで、私は何らかの形で返されたバイトのステータスに影響を与えていません。クライアントとサービスのログは、例外がスローされているかその他の問題があることを示していません。

クライアントおよびサーバーアプリケーションのバインディング(およびその他の構成)属性の正しい組み合わせを設定する経験はあまりありません。過去のデフォルトに依存しています。最大許容ファイルサイズを転送するようにサービスとクライアントを構成する必要があります。残念ながら、MTOMを使用できません。

これ 投稿とリンクは、私に洞察を提供しませんでした。これまでのところ、私は他に役立つ情報を見つけていません。

うまくいけば、誰かが問題が何であるかを私に助けてくれることができます。以下は、私が使用しているバインディングです。

クライアント[web.config]:

  <bindings>  
         <netTcpBinding>
            <binding name="TCP"  
                       closeTimeout="00:01:00" 
                       openTimeout="00:10:00"
                       receiveTimeout="00:01:00" sendTimeout="00:01:00" 
                       transferMode="Streamed" 
                       maxBufferPoolSize="512"
                       maxBufferSize="2147483647" 
                       maxConnections="10" 
                       maxReceivedMessageSize="2147483647">     

               <readerQuotas maxDepth="32" 
                             maxStringContentLength="2147483647" 
                             maxArrayLength="2147483647"
                             maxBytesPerRead="4096" 
                             maxNameTableCharCount="2147483647" />
               <reliableSession ordered="true" inactivityTimeout="00:10:00"
                 enabled="false" />
               <security mode="Transport">
                  <transport clientCredentialType="Windows" protectionLevel="EncryptAndSign" />
                  <message clientCredentialType="Windows" />
               </security>
            </binding>
         </netTcpBinding>

サービス:

<netTcpBinding>
        <binding name="netTCP"
                 closeTimeout="00:01:00"
                 openTimeout="00:01:00"
                 receiveTimeout="00:01:00" sendTimeout="00:01:00"
                 transferMode="Streamed"
                 listenBacklog="30"
                 maxBufferPoolSize="512"
                 maxBufferSize="2147483647"
                 maxConnections="30"
                 maxReceivedMessageSize="2147483647"
                 portSharingEnabled="true">
          <readerQuotas maxDepth="32"
                        maxStringContentLength="2147483647"
                        maxArrayLength="2147483647"
                        maxBytesPerRead="4096"
                        maxNameTableCharCount="2147483647" />
        </binding>
      </netTcpBinding>
役に立ちましたか?

解決

愚かな私。私はそれを持っていると思います。

バインディングは大丈夫でした。私は、クライアントのバッファーにバイトを正しく読むことを扱っていませんでした。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top