簡體   English   中英

WCF 413 請求實體太大 - 自托管 WebHttpBinding

[英]WCF 413 Request Entity Too Large - Self Hosted WebHttpBinding

關於這個問題有很多討論,但是我現在已經嘗試了所有可能的解決方案,我們仍然從服務器收到 413 Request Entity Too Large 錯誤。

我們的 WCF 服務是通過 Azure 工作者角色自托管的,不使用 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) 請求實體太大 | 上傳預讀大小

那里有人知道僅適用於自托管 WCF 服務的等效設置嗎?

由於這篇看似無關的帖子,我找到了問題:

http://forums.newatlanta.com/messages.cfm?threadid=554611A2-E03F-43DB-92F996F4B6222BC0&#top

這絕對是一個SSL問題,與將SSL證書綁定到您托管的端口有關。 您必須使用netsh綁定證書,並將clientcertnegotiation = enable添加到綁定中。

在我們的例子中,由於使用了不同的端口,因此我們已經在使用netsh,因此綁定現在看起來像這樣:

netsh http add sslcert ipport=0.0.0.0:10100 certhash=000000089A6679262D845B650FDDE5390F0D86AB appid={000007b4-2d4b-4587-ae99-7a6627476f76} clientcertnegotiation=enable

對於那些通過IIS托管並更改UploadReadAheadSize值的用戶,上面的論壇帖子指出,這可能會導致CPU占用過多,而該解決方案可能會更好。

如果需要傳輸大數據,則應使用transferMode =“ Streaming”。

看一下MS的這篇論文:

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

<webHttpBinding>
   <binding name="TransportSecurity" closeTimeout="00:01:00" openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:01:00" maxBufferSize="2147483647" maxBufferPoolSize="2147483647" maxReceivedMessageSize="2147483647">
        <security mode="Transport" />
      <readerQuotas maxDepth="2147483647" maxStringContentLength="2147483647" maxArrayLength="2147483647" maxBytesPerRead="2147483647" maxNameTableCharCount="16384" />
   </binding>

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM