WCFクライアント - WCFサービスから返されたストリームの最初の255バイトのみが値を含む
-
02-10-2019 - |
質問
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>
解決
愚かな私。私はそれを持っていると思います。
バインディングは大丈夫でした。私は、クライアントのバッファーにバイトを正しく読むことを扱っていませんでした。