我是一个广泛使用WCF的项目的新手,我对WCF的经验并不广泛。我正在尝试追踪一个问题,我的UI在10分钟后出现超时错误,同时等待长时间运行的服务调用返回。这里非常粗略是我的项目所需要的:
[service A] <=> [service B] <=> [UI console]
以下是我收集的内容:
serviceA和serviceB之间发生超时,而不是在serviceB和UI控制台之间,因为我实际上有两个独立的UI控制台:一个是MMC管理单元,一个是PowerShell管理单元,两者都展示同样的10分钟超时。
我在serviceA和serviceB中的端点都使用basicHttpBinding;两者都有bindingConfigurations,在30分钟而不是10分钟指定sendTimeout和receiveTimeout。
ReliableSession.InactivityTimeout默认为我读过10分钟,但我不相信其中任何一个都是ReliableSession所以它不适用。
我将serviceB用于WCF跟踪; ServiceTraceViewer在长时间运行的服务调用开始之前显示了相应的活动,之后没有任何内容,包括10分钟超时。
随意挑战我的任何断言和/或让我知道我还能做些什么来诊断这个问题。
2013.04.04更新
以下是实际的错误消息:
请求频道在等待回复后超时 00:09:59.9839984。增加传递给调用的超时值 请求或增加Binding上的SendTimeout值。时间 分配给这个操作可能是一个更长的一部分 超时。
服务器堆栈跟踪:at System.ServiceModel.Channels.RequestChannel.Request(消息消息, TimeSpan超时)at System.ServiceModel.Dispatcher.RequestChannelBinder.Request(消息 消息,TimeSpan超时)at System.ServiceModel.Channels.ServiceChannel.Call(String action, Boolean oneway,ProxyOperationRuntime操作,Object [] ins, 对象[]出局,TimeSpan超时)at System.ServiceModel.Channels.ServiceChannelProxy.InvokeService(IMethodCallMessage methodCall,ProxyOperationRuntime operation)at System.ServiceModel.Channels.ServiceChannelProxy.Invoke(即时聊天 消息)
在[0]处重新抛出异常:at System.Runtime.Remoting.Proxies.RealProxy.HandleReturnMessage(即时聊天 reqMsg,IMessage retMsg)at System.Runtime.Remoting.Proxies.RealProxy.PrivateInvoke(MessageData&安培; msgData,Int32类型)at NextIT.ActiveAdministration.DataContracts.IActiveAdministration.PublishAgentSettings() 在......
内在的例外:
对“
http://localhost/MyAdminService/
”的HTTP请求 已超过00:10:00分配的超时时间。分配给的时间 此操作可能是较长超时的一部分。在 System.ServiceModel.Channels.HttpChannelUtilities.ProcessGetResponseWebException(引发WebException webException,HttpWebRequest请求,HttpAbortReason abortReason)
在 System.ServiceModel.Channels.HttpChannelFactory`1.HttpRequestChannel.HttpChannelRequest.WaitForReply(时间跨度 超时)at System.ServiceModel.Channels.RequestChannel.Request(消息消息, TimeSpan超时)
答案 0 :(得分:0)
尝试使用操作超时,如下所述:http://final-proj.blogspot.co.il/2009/09/wcf-timeouts.html?m=1
此外,这种服务配置可能会导致超时,例如使用回调。 。 。 (来自这篇文章Timeouts WCF Services)
答案 1 :(得分:0)
有一句古老的格言“如果它不起作用,请尝试将其插入。”我非常专注于通过app.config文件的痛苦曲折来解决问题大火和充满混乱 - 部分是因为在这个大型项目中实际上有5个app.config文件具有各种绑定和服务(!) - 我没有注意到代码覆盖配置文件的明显部分:
binding.ReceiveTimeout = new TimeSpan(0, 0, 10, 0);
binding.SendTimeout = new TimeSpan(0, 0, 10, 0);
叹息。
但等等 - 还有更多。我最初想知道为什么配置文件中的30分钟值没有效果,因为超时发生在10分钟?好吧,事实证明,如上所示,代码中的10分钟超时设置是从UI控制台到serviceB。配置文件中设置的30分钟超时时间是从serviceB到serviceA,所以我不得不打开两个更宽,以便继续长时间运行。