Silverlight WCF 超时
Posted
技术标签:
【中文标题】Silverlight WCF 超时【英文标题】:Silverlight WCF Timeout 【发布时间】:2017-07-25 21:11:00 【问题描述】:我们最近切换了代码库,以编程方式设置 WCF 绑定并生成代理。我们不再在 ServiceReferences.clientconfig 中定义配置。从那时起,Silverlight 中的一些长 WCF 调用一直超时,我不知道为什么。我已将绑定中的所有超时设置为 24 小时。我需要一些关于如何诊断问题的建议。
起初我以为问题是客户端超时,因为错误发生在几分钟后,但服务器端的代码仍在继续,最终成功完成。但我现在并不完全确定这一点。我正在查看 Kestrel 日志窗口,并注意到它说请求完成的同时在 Silverlight 中弹出错误,即使操作在服务器端继续。但是,我找不到有关在服务器端设置 OperationTimeout 的任何信息。这是服务器端的绑定:
private static CustomBinding CreateCustomBinding()
var httpTransportBindingElement = new HttpTransportBindingElement
MaxBufferPoolSize = 2147483647,
MaxBufferSize = 2147483647,
MaxReceivedMessageSize = 2147483647
;
var bindingElements = new BindingElementCollection();
var binaryMessageEncodingBindingElement = new BinaryMessageEncodingBindingElement
MaxReadPoolSize = 2147483647,
MaxSessionSize = 2147483647,
MaxWritePoolSize = 2147483647,
ReaderQuotas = new XmlDictionaryReaderQuotas
MaxDepth = 2147483647,
MaxStringContentLength = 2147483647,
MaxArrayLength = 2147483647,
MaxBytesPerRead = 2147483647,
MaxNameTableCharCount = 2147483647
;
bindingElements.Add(binaryMessageEncodingBindingElement);
bindingElements.Add(httpTransportBindingElement);
var binding = new CustomBinding(bindingElements)
Name = "UserNameBinding",
CloseTimeout = new TimeSpan(24, 0, 0),
OpenTimeout = new TimeSpan(24, 0, 0),
ReceiveTimeout = new TimeSpan(24, 0, 0),
SendTimeout = new TimeSpan(24, 0, 0)
;
return binding;
这里是如何在客户端创建绑定的代码。让我知道我是否缺少任何其他相关的代码。我已调试此代码以确保代理正在获取此绑定设置。
public static Binding GetWCFBinding(bool isHttps)
var binding = new CustomBinding
CloseTimeout = new TimeSpan(24, 00, 00),
OpenTimeout = new TimeSpan(24, 00, 00),
ReceiveTimeout = new TimeSpan(24, 00, 00),
SendTimeout = new TimeSpan(24, 00, 00)
;
var binaryMessageEncodingBindingElement = new BinaryMessageEncodingBindingElement();
binding.Elements.Add(binaryMessageEncodingBindingElement);
binding.Elements.Add(isHttps
? new HttpsTransportBindingElement()
MaxBufferSize = int.MaxValue,
MaxReceivedMessageSize = int.MaxValue,
TransferMode = TransferMode.Buffered
: new HttpTransportBindingElement()
MaxBufferSize = int.MaxValue,
MaxReceivedMessageSize = int.MaxValue,
TransferMode = TransferMode.Buffered
);
return binding;
我也在代理的构造函数中加入了这一行:
InnerChannel.OperationTimeout = new TimeSpan(24, 0, 0);
错误是这种无法描述的错误,当服务器出现问题或客户端超时时总是返回:
模块:Adapt.Presentation.Xivic.CodeGeneration 异常消息:远程服务器返回错误:NotFound。 时间:2017 年 6 月 3 日下午 4:17:55 堆栈跟踪:偏移处的 ThrowForNonSuccess 90 in file:line:column:0:0 HandleNonSuccess at 文件中的偏移量 87:line:column:0:0 GetResult at 文件中的偏移量 30:行:列:0:0 MoveNext 在 文件中的偏移量 525:行:列:0:0 完全异常: System.ServiceModel.CommunicationException:远程服务器返回 错误:未找到。 ---> System.Net.WebException:远程服务器 返回错误:未找到。 ---> System.Net.WebException:远程 服务器返回错误:未找到。在 System.Net.Browser.BrowserHttpWebRequest.InternalEndGetResponse(IAsyncResult asyncResult) 在 System.Net.Browser.BrowserHttpWebRequest.c__DisplayClassa.b__9(对象 发送状态)在 System.Net.Browser.AsyncHelper.c__DisplayClass4.b__0(对象 sendState) --- 内部异常堆栈跟踪结束 --- at System.Net.Browser.AsyncHelper.BeginOnUI(SendOrPostCallback 开始方法,对象状态)在 System.Net.Browser.BrowserHttpWebRequest.EndGetResponse(IAsyncResult asyncResult) 在 System.ServiceModel.Channels.HttpChannelFactory.HttpRequestChannel.HttpChannelAsyncRequest.CompleteGetResponse(IAsyncResult 结果)---内部异常堆栈跟踪结束---在 Microsoft.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(任务 任务)在 Microsoft.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccess(任务 任务)在 Microsoft.Runtime.CompilerServices.TaskAwaiter`1.GetResult() 在 Adapt.Presentation.Xivic.CodeGeneration.d__15.MoveNext()
【问题讨论】:
【参考方案1】:由于您使用的是 Silverlight,这很可能是 DomainService
未找到错误。这是相当常见的问题,并且指向服务器上的错误配置。您应该能够启动 Fiddler 并查看失败的 URL,并将其与服务器端的先前版本进行比较。
只是快速浏览您的绑定,我看不到为您的服务定义的端点。
【讨论】:
以上是关于Silverlight WCF 超时的主要内容,如果未能解决你的问题,请参考以下文章
SilverLight、WCf 服务、Datetime.Today