我目前有一个应用程序在服务器上调用Web服务进行搜索。我们可以期待返回大量数据,因此搜索花费的时间超过一分钟是常规的。
我们一直收到以下大量搜索的错误消息:
请求频道在00:00:59.7350618之后等待回复时超时。增加传递给Request的调用的超时值或增加Binding上的SendTimeout值。分配给此操作的时间可能是较长超时的一部分。
这是我们在StackOverflow上发布的多个问题中看到的问题,遗憾的是,没有一个可用的解决方案帮助我解决了问题,甚至无法配置超时窗口。
我们都更改了客户端的app.config,增加了所有超时(CloseTimeout,OpenTimeout,ReceiveTimeout和SendTimeout)以及服务器上服务的所有web.config值(closeTimeout,openTimeout和的SendTimeout)。
这些变化都没有任何影响,我仍然收到分钟超时。知道为什么改变这些值会产生影响吗?
在下面的示例中,我们缩短了让我们不必在测试期间等待整整一分钟的时间。
的Web.config:
<configuration>
<system.web>
<compilation targetFramework="4.0" />
</system.web>
<system.diagnostics>
<trace autoflush="true" />
<sources>
<source name="System.Net">
<listeners>
<add name="TraceFile" />
</listeners>
</source>
<source name="System.Net.Sockets">
<listeners>
<add name="TraceFile" />
</listeners>
</source>
</sources>
<sharedListeners>
<add name="TraceFile" type="System.Diagnostics.TextWriterTraceListener"
initializeData="trace.log" />
</sharedListeners>
<switches>
<add name="System.Net" value="Verbose" />
<add name="System.Net.Sockets" value="Verbose" />
</switches>
</system.diagnostics>
<system.serviceModel>
<diagnostics>
<messageLogging logMalformedMessages="false" logMessagesAtServiceLevel="false"
logMessagesAtTransportLevel="false" />
</diagnostics>
<services>
<service behaviorConfiguration="SearchIndexServiceBehavior" name="SearchIndex.Service">
<endpoint address="" binding="basicHttpBinding" contract="ISearchIndexServices" />
<host>
<timeouts closeTimeout="00:00:10" />
</host>
</service>
</services>
<bindings>
<basicHttpBinding>
<binding closeTimeout="00:00:10" openTimeout="00:00:15" sendTimeout="00:00:20"
receiveTimeout="00:00:25" maxBufferSize="2147483647" maxBufferPoolSize="2147483647"
maxReceivedMessageSize="2147483647">
<readerQuotas maxDepth="2147483647" maxStringContentLength="2147483647"
maxArrayLength="2147483647" maxBytesPerRead="2147483647"
maxNameTableCharCount="2147483647" />
</binding>
</basicHttpBinding>
</bindings>
<behaviors>
<serviceBehaviors>
<behavior name="SearchIndexServiceBehavior">
<serviceMetadata httpGetEnabled="false" />
<serviceDebug includeExceptionDetailInFaults="false" />
</behavior>
</serviceBehaviors>
</behaviors>
</system.serviceModel>
<system.transactions>
<defaultSettings timeout="00:05:00" />
</system.transactions>
</configuration>
的app.config
<configuration>
<configSections>
</configSections>
<startup>
</startup>
<system.serviceModel>
<bindings>
<basicHttpBinding>
<binding name="BasicHttpBinding_ISearchIndexServices" closeTimeout="00:00:10" openTimeout="00:00:15" receiveTimeout="00:10:00" sendTimeout="00:00:20" allowCookies="false" bypassProxyOnLocal="false" hostNameComparisonMode="StrongWildcard" maxBufferSize="5242880" maxBufferPoolSize="524288" maxReceivedMessageSize="5242880" messageEncoding="Text" textEncoding="utf-8" transferMode="Buffered" useDefaultWebProxy="true">
<readerQuotas maxDepth="32" maxStringContentLength="5242880"maxArrayLength="16384" maxBytesPerRead="4096" maxNameTableCharCount="16384" />
<security mode="None">
<transport clientCredentialType="None" proxyCredentialType="None" realm="" />
<message clientCredentialType="UserName" algorithmSuite="Default" />
</security>
</binding>
</basicHttpBinding>
</bindings>
<client>
<endpoint address="http://MyServer/SearchIndexService/SearchIndexServices.svc" binding="basicHttpBinding" bindingConfiguration="BasicHttpBinding_ISearchIndexServices" contract="WFC.ISearchIndexServices" name="BasicHttpBinding_ISearchIndexServices" />
</client>
</system.serviceModel>
</configuration>
答案 0 :(得分:12)
我认为您可能正在为客户端请求通道执行OperationTimeout,由于某种原因,该通道无法通过标准配置属性轻松调整。
在调用长时间运行的操作之前,请在客户端代码中尝试:
((IContextChannel)clientProxy.InnerChannel).OperationTimeout = new TimeSpan(0,30,0); // For 30 minute timeout - adjust as necessary
其中clientProxy
是服务引用生成的客户端类的实例(派生自ClientBase<ISearchIndexService>
)。
答案 1 :(得分:4)
你可以试试这个
SeriveClient client=new ServiceClient();
var time = new TimeSpan(0, 3, 0);
client.Endpoint.Binding.CloseTimeout = time;
client.Endpoint.Binding.OpenTimeout = time;
client.Endpoint.Binding.ReceiveTimeout = time;
client.Endpoint.Binding.SendTimeout = time;
答案 2 :(得分:3)
此服务模型示例显示了需要在客户端web.config中设置的绑定元素超时属性。
请注意,所有超时属性都设置为10分钟。此示例使用绑定配置元素来设置“maxItemsInObjectGraph”属性。通常,如果您需要关闭超时,这意味着您可能正在传输大量数据。另请注意,要传输的数据大小都设置为最多可处理2千兆字节。
<?xml version="1.0" encoding="UTF-8"?>
<system.serviceModel>
<bindings>
<basicHttpBinding>
<binding name="BasicHttpBinding_ISearchIndexServices" closeTimeout="00:10:00" openTimeout="00:10:00" receiveTimeout="00:10:00" sendTimeout="00:10:00" allowCookies="false" bypassProxyOnLocal="false" hostNameComparisonMode="StrongWildcard" maxBufferSize="2147483647" maxBufferPoolSize="2147483647" maxReceivedMessageSize="2147483647" messageEncoding="Text" textEncoding="utf-8" transferMode="Buffered" useDefaultWebProxy="true">
<readerQuotas maxDepth="32" 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>
<client>
<endpoint address="http://MyServer/SearchIndexService/SearchIndexServices.svc" behaviorConfiguration="SearchIndexServicesBehavior" binding="basicHttpBinding" bindingConfiguration="BasicHttpBinding_ISearchIndexServices" contract="WFC.ISearchIndexServices" name="BasicHttpBinding_ISearchIndexServices" />
</client>
<behaviors>
<endpointBehaviors>
<behavior name="SearchIndexServicesBehavior">
<dataContractSerializer maxItemsInObjectGraph="2147483647" />
</behavior>
</endpointBehaviors>
</behaviors>
</system.serviceModel>
答案 3 :(得分:0)
超时是客户端的发送超时。这是客户端准备等待响应的时间,因此必须在客户端而不是服务上设置
答案 4 :(得分:0)
超时是调试的麻烦。谁能在一分钟内完成调试!我从上面使用了Junior M / BuzzWilder,并将以下内容添加到app.config中的服务调用中:
<binding name="WSHttpBinding_bindingname"
openTimeout="01:00:00"
closeTimeout="01:00:00"
receiveTimeout="01:00:00"
sendTimeout="01:00:00"
>
再见服务超时。 :)