2016-06-19 11 views
1

ファイルが1.5GBを超えると、QuotaExceededExceptionを投げているWCFファイル転送サービスがあります。私は同様の記事を見直しましたが、私はなぜ例外を取得しているのか、それを解決する方法を理解していません。QuotaExceededExceptionをスローしているWCFファイル転送サービス

System.ServiceModel.QuotaExceededException:受信メッセージ(2147483647)の最大メッセージサイズクォータを超えました。クォータを増やすには、適切なバインディング要素でMaxReceivedMessageSizeプロパティを使用します。ここで

は私のクライアントapp.configのスニップです:

<basicHttpBinding> 
    <binding name="BasicHttpBinding_IFileTransfer" 
      maxReceivedMessageSize="2147483647" maxBufferSize="2147483647" 
      transferMode="Streamed" 
      receiveTimeout="00:30:00" sendTimeout="01:30:00" 
      openTimeout="00:30:00" closeTimeout="00:30:00"> 
     <readerQuotas maxDepth="32" maxStringContentLength="2147483647" 
         maxArrayLength="2147483647" maxBytesPerRead="2147483647" 
         maxNameTableCharCount="16384"/> 
    </binding> 
</basicHttpBinding> 

は、ここに私のweb.configのスニップです:

<basicHttpBinding> 
    <binding name="FileTransfer" maxReceivedMessageSize="2147483647" 
      maxBufferSize="2147483647" transferMode="Streamed" 
      receiveTimeout="00:30:00" sendTimeout="01:30:00" 
      openTimeout="00:30:00" closeTimeout="00:30:00"> 
     <readerQuotas maxDepth="32" maxStringContentLength="2147483647" 
         maxArrayLength="2147483647" maxBytesPerRead="2147483647" 
         maxNameTableCharCount="16384"/> 
    </binding> 
</basicHttpBinding> 

はここで例外を投げるのサービスコードのスニップです:

var sum = 0; 

try 
{ 
    FileStream targetStream; 
    var sourceStream = request.FileByteStream; 

    using (targetStream = new FileStream(tfile, FileMode.Create, FileAccess.Write, FileShare.None)) 
    { 
     const int bufferLen = 1024 * 64; 
     var buffer = new byte[bufferLen]; 
     int count; 

     while ((count = sourceStream.Read(buffer, 0, bufferLen)) > 0) 
     { 
      targetStream.Write(buffer, 0, count); 
      sum += count; 
     } 

     targetStream.Close(); 
     sourceStream.Close(); 
    } 
} 
catch (Exception ex) 
{ 
    Logger.Debug("sum = " + sum); // sum = 1610609664 bytes (this is 1.499997 GB) 
    Logger.LogException(ex); 
} 

私はそれ以上のものを得ることができません1.5GB

+0

「maxReceivedMessageSize」は、実際に転送されたすべてのヘッダーとデータのサイズを含め、転送された合計データです。たとえばSOAPメッセージとして転送し、データがBase64でエンコードされている場合、転送される実際のデータにはオーバーヘッドが多くなるため、おそらく1.5GBファイルで2GBの制限に達するでしょう。制限を増やす必要があります(Int64.MaxValueが必要ですが、バインディングのコードでのみ可能です。http://stackoverflow.com/questions/1004717/what-is-the-maximum-size-that-maxreceivedmessagesize-ネットネームのために設定可能) – steve16351

答えて

0

ありがとうsteve16351、私はそのmaxReceivedMessageSizeが長いことに気付かなかった。私は設定ファイルをInt64.MaxValue(9223372036854775807)で更新し、6.8 GBのファイルをアップロードできました。

<basicHttpBinding> 
    <binding name="FileTransfer" maxReceivedMessageSize="9223372036854775807" maxBufferSize="2147483647" transferMode="Streamed" receiveTimeout="00:30:00" sendTimeout="01:30:00" openTimeout="00:30:00" closeTimeout="00:30:00"> 
     <readerQuotas maxDepth="32" maxStringContentLength="2147483647" maxArrayLength="2147483647" maxBytesPerRead="2147483647" maxNameTableCharCount="16384"/> 
    </binding> 
</basicHttpBinding> 

私は長い間私の合計を変更し、素晴らしい作品です。

var sum = 0L; 
try 
{ 
    FileStream targetStream; 
    var sourceStream = request.FileByteStream; 
    using (targetStream = new FileStream(tfile, FileMode.Create, FileAccess.Write, FileShare.None)) 
    { 
     const int bufferLen = 1024 * 64; 
     var buffer = new byte[bufferLen]; 
     int count; 
     while ((count = sourceStream.Read(buffer, 0, bufferLen)) > 0) 
     { 
      targetStream.Write(buffer, 0, count); 
      sum += count; 
     } 
     targetStream.Close(); 
     sourceStream.Close(); 
    } 
} 
catch (Exception ex) 
{ 
    Logger.Debug("sum = " + sum); // no more exception 
    Logger.LogException(ex); 
} 
関連する問題