1

この問題については多くの議論がありますが、考えられるすべての解決策を試してみましたが、まだサーバーから 413 Request Entity Too Large エラーが発生しています。

当社の WCF サービスは Azure Worker ロールを介して自己ホストされており、IIS は使用しません。すべての構成はコードで指定されています。

var host = new ServiceHost(searchEngine);

// Create binding
var binding = new WebHttpBinding(WebHttpSecurityMode.Transport);

binding.MaxReceivedMessageSize = 2147483647;
binding.MaxBufferSize = 2147483647;
binding.MaxBufferPoolSize = 2147483647;

var readerQuotas = new XmlDictionaryReaderQuotas
{
    MaxStringContentLength = 2147483647,
    MaxArrayLength = 2147483647,
    MaxBytesPerRead = 2147483647,
    MaxDepth = 2147483647,
    MaxNameTableCharCount = 2147483647
};

// Setting quotas on a BindingElement after the binding is created has no effect on that binding.
// See: https://stackoverflow.com/questions/969479/modify-endpoint-readerquotas-programatically
binding.GetType().GetProperty("ReaderQuotas").SetValue(binding, readerQuotas, null);

binding.ReceiveTimeout = new TimeSpan(1, 0, 0);
binding.SendTimeout = new TimeSpan(1, 0, 0);

// Add the service endpoint
var ep = host.AddServiceEndpoint(
    typeof(ISearchEngine),
    binding,
    string.Format("https://{0}/SearchEngine", externalEndpoint));

ep.Behaviors.Add(new WebHttpBehavior());

// Increase the MaxItemsInObjectGraph quota for all operations in this service
foreach (var operation in ep.Contract.Operations)
{
    operation.Behaviors.Find<DataContractSerializerOperationBehavior>().MaxItemsInObjectGraph = 10000000;
}

return host;

そして、これは私たちのクライアント構成です - これもコードで指定されています:

var binding = new WebHttpBinding(WebHttpSecurityMode.Transport);

binding.MaxReceivedMessageSize = 2147483647;
binding.MaxBufferSize = 2147483647;
binding.MaxBufferPoolSize = 2147483647;

var readerQuotas = new XmlDictionaryReaderQuotas
{
    MaxStringContentLength = 2147483647,
    MaxArrayLength = 2147483647,
    MaxBytesPerRead = 2147483647,
    MaxDepth = 2147483647,
    MaxNameTableCharCount = 2147483647
};

// Setting quotas on a BindingElement after the binding is created has no effect on that binding.
// See: https://stackoverflow.com/questions/969479/modify-endpoint-readerquotas-programatically
binding.GetType().GetProperty("ReaderQuotas").SetValue(binding, readerQuotas, null);

binding.ReceiveTimeout = new TimeSpan(1, 0, 0);
binding.SendTimeout = new TimeSpan(1, 0, 0);

binding.Security.Transport.ClientCredentialType = HttpClientCredentialType.Basic;

var channelFactory = new ChannelFactory<ISearchEngine>(binding, endpointAddress);

channelFactory.Endpoint.Behaviors.Add(new WebHttpBehavior());


// Increase the MaxItemsInObjectGraph quota for all operations in this service
foreach (var operation in channelFactory.Endpoint.Contract.Operations)
{
    operation.Behaviors.Find<DataContractSerializerOperationBehavior>().MaxItemsInObjectGraph = 10000000;
}

return channelFactory.CreateChannel();

私の唯一の予感は、SSL 接続の問題でしょうか? IIS 固有の問題について言及している記事がいくつかありますが、これがセルフ ホスト サービスに関連するかどうかはわかりません。

アドバイスをいただければ幸いです。

アップデート:

SSL が問題であるという私の予感を確認するために、一時的に SSL を無効にすると、問題が解消されました。

そのため、SSL が問題を引き起こしている理由を突き止める必要があります。同様の問題に関するかなりのドキュメントがありますが、IIS がホストするサービスのみに関連しています (私たちのサービスは Windows サービスから自己ホストされています)。

IIS7 - (413) 要求エンティティが大きすぎます | アップロードReadAheadSize

自己ホスト型の WCF サービスにのみ適用される同等の設定を知っている人はいますか?

4

3 に答える 3

1

大きなデータを転送する必要がある場合は、transferMode = "Streaming" を使用する必要があります。

MS の次の論文をご覧ください。

http://msdn.microsoft.com/en-us/library/ms733742(v=vs.110).aspx

于 2014-03-05T16:54:03.960 に答える