gpt4 book ai didi

.net - WCF Silverlight 客户端获取轮询消息的 404 未找到响应

转载 作者:行者123 更新时间:2023-12-03 01:04:57 25 4
gpt4 key购买 nike

最终,WCF 双工 Silverlight 4 客户端开始获取 404 Not Found轮询消息错误,在轮询从 WCF 服务发送到 Silverlight 客户端后立即出现,有时第二次轮询会发生这种情况,有时连接可以工作数小时甚至数天,但大多数情况下在前几分钟会失败。

!有趣的是,这个问题就像使用MaxMessagesPerPoll时已知的Silverlight 4错误一样。双工模式及解决方案描述herehere但我正在使用SingleMessagePerPoll模式。无论如何,我尝试使用 ClientStack按照建议,但没有任何改变。

总体流程:

  1. SL客户端执行WCF服务方法,收到响应
  2. 然后立即 SL 客户端开始向服务发送轮询消息,然后收到第二条或 N-s 轮询消息的异常

    System.Net.WebException: The remote server returned an error: NotFound

  3. Fiddler 仅显示空 404对投票消息的响应
  4. 然后引发客户端 channel 故障事件

我正在尝试在发生此类故障后重新连接 SL 客户端,单次重新连接重试流程:

  1. 句柄Faulted事件
  2. 取消订阅所有 channel 事件,例如 Closed/Closing/Opened/Opening
  3. 使用try { close } catch { abort }以正确的方式关闭 channel
  4. 以下所有内容均位于新线程投票线程中:(我发现这工作得稍微稳定 - see this article )
  5. 等待 45-70 秒
  6. 使用相同的 DuplexChannelFactory<T>实例创建一个新 channel ,订阅所有 channel 事件仅用于记录目的
  7. 执行WCF服务方法

经过 1-10 次重试(约 1-10 分钟),客户端最终连接到服务器并继续正常轮询。

在 WCF 服务日志中,我看到它获取了所有 cleint 请求,处理时没有任何异常,因此看起来 Silverlight 客户端发生了一些事情。

一般信息:

  • .NET Framework 4.0
  • 轮询双工
  • 异步 WCF 方法
  • IIS 6.0 托管的 WCF 服务
  • Silverligth 4 客户端
  • 客户端操作系统:Windows XP SP2
  • 服务器操作系统:Windows 2003 R2 SP2
  • NTLM 身份验证
  • 双工模式:SingleMessagePerPoll
  • 还有另一个 WCF 服务在我的服务开始工作之前执行请求/回复,但它不使用双工连接
  • 在 SL 客户端服务上,我将所有内容记录到 UI 中,以便查看所有事件流程并为每个特定事件留出时间
  • IIS 日志、服务器事件日志中没有错误

客户端:

var binaryBinding = new BinaryMessageEncodingBindingElement();
binaryBinding.ReaderQuotas.MaxStringContentLength = int.MaxValue;

var httpbindingElement = new HttpTransportBindingElement
{
MaxReceivedMessageSize = 131072
};

var pollingDuplexBindingElement = new PollingDuplexBindingElement
{
ClientPollTimeout = new TimeSpan(0, 0, 1, 30),
InactivityTimeout = new TimeSpan(0, 8, 0, 0),
};


_binding = new CustomBinding(
pollingDuplexBindingElement,
binaryBinding,
httpbindingElement)
{
SendTimeout = new TimeSpan(0, 0, 0, 45),
CloseTimeout = new TimeSpan(0, 0, 0, 25),
ReceiveTimeout = new TimeSpan(0, 8, 0, 0),
OpenTimeout = new TimeSpan(0, 0, 0, 45)
};


httpbindingElement.AuthenticationScheme = AuthenticationSchemes.Negotiate;
var endpoint = new EndpointAddress(_endpointAddress);
_channelFactory = new DuplexChannelFactory<TWebService>(
new InstanceContext(instanceOfClientServiceClass),
_binding,
endpoint);


// then this factory used to create a new channels
// Also for a new channel I'm setting OpTimeout
var contextChannel = newChannel as IContextChannel;
if (contextChannel != null)
{
contextChannel.OperationTimeout = TimeSpan.FromSeconds(45);
}

服务器:

  • WCF、PerSession、多线程
  • 一切都是线程安全的
  • 执行时没有服务器服务异常
  • 大量日志记录,以便我了解服务上发生的情况
  • 所有 WCF 跟踪均通过 switchValue All 启用,没有什么可疑的
<binding name="customName"
sendTimeout="00:01:00"
receiveTimeout="08:00:00"
openTimeout="00:01:00"
closeTimeout="00:00:35">
<pollingDuplex
inactivityTimeout="08:00:00"
serverPollTimeout="00:01:00" />
<binaryMessageEncoding />
<httpTransport authenticationScheme="Ntlm"
maxReceivedMessageSize="131072">
</httpTransport>
</binding>

<behavior name="customBehavior">
<dataContractSerializer maxItemsInObjectGraph="2147483647" />
<serviceDebug includeExceptionDetailInFaults="true" />
<serviceThrottling
maxConcurrentCalls = "500"
maxConcurrentSessions = "500"
maxConcurrentInstances = "500" />
</behavior>

最佳答案

如果一切似乎都工作正常,那么这可能是网络基础设施/配置问题(例如 dns 配置)。在本地运行或使用 IP 地址而不是主机名时,您是否遇到同样的问题?

如果您在 IIS 中的站点上配置了多个绑定(bind),也可能会出现类似问题(有关详细信息,请参阅此处:http://blogs.msdn.com/b/rampo/archive/2008/02/11/how-can-wcf-support-multiple-iis-binding-specified-per-site.aspx)

另一件事是如何从服务器到客户端进行通信。如果您在循环中迭代客户端并一一调用回调方法,那么您可能会遇到超时,显示为 404 秒。通常应该在后台线程上调用回调(每个客户端一个)。

根据您进行通信的方式,这也可能是由死锁引起的(当 UI 线程涉及向服务发送/接收消息/回调时)。

关于.net - WCF Silverlight 客户端获取轮询消息的 404 未找到响应,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13838777/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com