答えが見つからない不可解な問題が発生しています。大量のデータをWCFサービスにアップロードしようとしていますが、64 kbの制限を下回る要求が送信された後、大量のデータ要求が受け入れられるまで、最初とそれ以降の試行で413エラーが返されます。バインディングでmaxReceivedMessageSize要素とmaxStringContentLength要素を既に拡張しました。これにより、最初の小さなリクエストの後にリクエストを送信する際の問題が修正されます(これらが拡張されていない場合、413ではなく別のエラー400が返されます)。
私のシステムはIIS7で実行されているASP.NET3.5アプリケーションであり、WCFサービスはカスタムバインディング、SOAPメッセージ、およびクライアント/サーバー証明書を使用します。
基本的に複製の順序は次のとおりです(2台のサーバーでテスト済み)
- IIS7ワーカープロセスが起動します
- 64kbを超えるリクエストの送信:413エラーを返します
- 64kbを超えるリクエストを送信する:413エラーを返します
- 64kb未満のリクエストを送信:200と有効なsoap応答を返します
- 64kbを超えるリクエストを送信:200と有効なsoap応答を返します
maxReceivedMessageSize要素とmaxStringContentLength要素が増加しない場合、次のようになります。
- IIS7ワーカープロセスが起動します
- 64kbを超えるリクエストの送信:413エラーを返します
- 64kbを超えるリクエストを送信する:413エラーを返します
- 64kb未満のリクエストを送信:200と有効なsoap応答を返します
- 64kbを超えるリクエストの送信:400エラーを返します
デバッグでは、413エラーを受け取ったとき、サーバーは実際にはサービスを初期化しておらず、小さなリクエストが届くと初期化され、バインディングルールに注意を払い、大量のデータを許可するようになっています。
これはWCFライブラリ内の問題であり、アップグレードすることで修正される可能性があると思いますが、これは実際にはオプションではなく、回避策が必要です。私は、アプリケーションの起動時に、問題のサービスを何らかの方法で初期化するか、デフォルトのWCFの最大受信バイト数を何らかの方法で増やすことを考えていました。
My web.configから:
<system.web>
<httpRuntime maxRequestLength="65536" executionTimeout="1800"/>
</system.web>
<system.webServer>
<security>
<requestFiltering>
<requestLimits maxAllowedContentLength="67108864" />
</requestFiltering>
</security>
</system.webServer>
<system.serviceModel>
<services>
<service behaviorConfiguration="ServiceTlsBehavior" name="ELSLookupServiceTLS">
<endpoint address="" binding="customBinding" bindingConfiguration="TlsBinding" contract="Lookup" />
</service>
</services>
<bindings>
<customBinding>
<binding name="TlsBinding" closeTimeout="00:04:00" openTimeout="00:12:00" receiveTimeout="00:15:00" sendTimeout="00:05:00">
<textMessageEncoding>
<readerQuotas maxStringContentLength="2147483647" maxArrayLength="2147483647" />
</textMessageEncoding>
<httpsTransport requireClientCertificate="true" maxReceivedMessageSize="6553600" maxBufferPoolSize="6553600" maxBufferSize="6553600" />
</binding>
</customBinding>
</bindings>
<behaviors>
<serviceBehaviors>
<behavior name="ServiceTlsBehavior">
<serviceMetadata httpGetEnabled="false" httpsGetEnabled="true" />
<serviceDebug includeExceptionDetailInFaults="true" />
<dataContractSerializer maxItemsInObjectGraph="6553600"/>
</behavior>
</serviceBehaviors>
</behaviors>
</system.serviceModel>
私のサービスの実装:
[ServiceBehavior(AddressFilterMode = AddressFilterMode.Any)]
public class ELSLookupService : Lookup
{
//serivce call implemented here
}