2

私は、WindowsサービスによってホストされているWCFサービスと通信するASP.NetWebFormsアプリケーションの管理を任されています。サービスに使用されるバインディングはnetTcpBindingです。

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

ファイルのダウンロードデータフローは、基本的に逆のプロセスです。バイトはデータベースから取得されます。WCFサービスのMemoryStreamに読み込まれます。その後、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>
4

1 に答える 1

0

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

バインディングはOKでした。ストリームからクライアントのバッファにバイトを正しく読み取ることを扱っていませんでした。

于 2010-09-12T17:51:19.477 に答える