私が対処しようとしているこのクレイジーな問題を手に入れました。大量のデータを取得する場合、クライアントの.configファイルのクォータを増やす必要があることは知っていますが、クライアントがWCFサーバーに「大量の」データを送信している場合はどうすればよいでしょうか。
小さいサイズの入力パラメーターを送信しているときは、完全に正常に機能します。残念ながら、入力が大きくなると故障します。
デバッガーは言う:
悪いリクエスト、400;
トレースファイルでは次のとおりです。
着信メッセージの最大メッセージサイズクォータ(65536)を超えました。クォータを増やすには、適切なバインディング要素でMaxReceivedMessageSizeプロパティを使用します。
サーバー側で受信データのこのクォータを増やす方法はありますか?もしそうなら、どのように?
構成関連のサンプルのサンプルを次に示します。
<bindings>
<basicHttpBinding>
<binding name="MyBasicHttpBinding"
closeTimeout="00:01:00" openTimeout="00:01:00" receiveTimeout="00:10:00"
sendTimeout="00:01:00" allowCookies="false" bypassProxyOnLocal="false"
hostNameComparisonMode="StrongWildcard" maxBufferSize="2147483647"
maxBufferPoolSize="2147483647" maxReceivedMessageSize="2147483647"
messageEncoding="Text" textEncoding="utf-8" transferMode="Buffered"
useDefaultWebProxy="true">
<readerQuotas maxDepth="64" maxStringContentLength="2147483647" maxArrayLength="2147483647"
maxBytesPerRead="2147483647" maxNameTableCharCount="2147483647" />
<security mode="None">
<transport clientCredentialType="None" proxyCredentialType="None"
realm="" />
<message clientCredentialType="UserName" algorithmSuite="Default" />
</security>
</binding>
</basicHttpBinding>
</bindings>
<services>
<service name="MyWcfService">
<endpoint address="http://myservice..."
binding="basicHttpBinding" bindingConfiguration="MyBasicHttpBinding"
name="MyBasicHttpBinding" contract="IMyContract" />
</service>
</services>
ここに私のクライアント側のコードがあります(動的に作成します):
var binding = new BasicHttpBinding();
binding.MaxBufferPoolSize = 2147483647;
binding.MaxBufferSize = 2147483647;
binding.MaxReceivedMessageSize = 2147483647;
binding.ReaderQuotas.MaxStringContentLength = 2147483647;
binding.ReaderQuotas.MaxArrayLength = 2147483647;
binding.ReaderQuotas.MaxDepth = 2147483647;
binding.ReaderQuotas.MaxBytesPerRead = 2147483647;
var address = new EndpointAddress("http://mylocalservice..");
ChannelFactory<IMyContract> factory = new ChannelFactory<IMyContract>(binding, address);
foreach (OperationDescription op in factory.Endpoint.Contract.Operations)
{
DataContractSerializerOperationBehavior dataContractBehavior =
op.Behaviors.Find<DataContractSerializerOperationBehavior>()
as DataContractSerializerOperationBehavior;
if (dataContractBehavior != null)
{
dataContractBehavior.MaxItemsInObjectGraph = 2147483646;
}
}
public IMyContract MyClientObject = factory.CreateChannel();
サービスの構成ファイルを介して、サービスのMaxReceivedMessageSize
プロパティを設定できます。
クライアントのMaxReceivedMessageSize
を設定すると、クライアントが受信したメッセージのみに影響します。サービスが受信したメッセージには影響しません。同様に、サービスが大きなメッセージを受信できるようにするには、サービスの構成ファイルを設定する必要があります。
サンプルのサービス構成
<system.serviceModel>
<bindings>
<wsHttpBinding>
<binding name="MyBinding" maxReceivedMessageSize="2147483647" />
</wsHttpBinding>
</bindings>
<services>
<service name="MyService">
<endpoint address="http://myservice" binding="wsHttpBinding"
bindingConfiguration="MyBinding" contract="IMyServiceContract" />
</service>
</services>
</system.serviceModel>
上記の設定ファイルは非常に簡略化されていますが、関連する部分を示しています。重要な部分は、バインディングを定義して名前を付け、デフォルトとは異なる値を明示的に設定し、その名前をエンドポイント要素のbindingConfiguration属性で使用することです。
私の問題は、wcfテストクライアントにありました。何らかの理由で、maxReceivedMessageSizeを増やしたクライアント構成は生成されません。私の修正は、「構成ファイル」->「SvcConfigEditorで編集」->バインディング-> maxReceivedMessageSizeを右クリックすることでした。
この問題は、構成ファイルのバインディングセクションに以下の追加のバインディングノードを追加することで解決できます。
<basicHttpBinding>
<binding maxBufferSize="2147483647" maxBufferPoolSize="2147483647" maxReceivedMessageSize="2147483647">
<readerQuotas maxDepth="2147483647" maxStringContentLength="2147483647" maxArrayLength="2147483647"
maxBytesPerRead="2147483647" maxNameTableCharCount="2147483647" />
</binding>
</basicHttpBinding>