正在排队服务呼叫
本文关键字:呼叫 服务 排队 | 更新日期: 2023-09-27 18:29:05
我正在实现一个大量使用WCF服务的Silverlight应用程序,现在我已经到了偶尔会有几个长服务调用阻止其他服务调用运行的地步。
这些服务呼叫最终超时。我想看看是否有可能让队列系统一个接一个地执行服务调用,这样长调用会阻塞其他调用,但不会导致它们超时。
我正在使用服务代理来包装服务呼叫
public interface IExampleServiceAgent
{
void ProcessData(int a, string b, EventHandler<ProcessDataCompletedEventArgs> callback);
}
Public ExampleServiceAgent1 : IExampleServiceAgent
{
ExampleClient _Client = new ExampleClient();
public void ProcessData(int anInt, string aString, EventHandler<ProcessDataCompletedEventArgs> callback)
{
EventHandler<ProcessDataCompletedEventArgs> wrapper = null;
wrapper = (a,b) =>
{
callback(a,b);
_Client.ProcessDataCompleted -= wrapper;
}
_Client.ProcessDataCompleted += wrapper;
_Client.ProcessDataAsync(anInt,aString);
}
}
然后将从以下代码调用上述服务代理:
ServiceAgent.ProcessData(1,"STRING", (a,b) =>
{
if (b.Error != null)
{
//Handle Error
}
else
{
//DO something with the data
}
}
有没有一种方法可以将这些服务调用放入队列并逐一执行?
我曾尝试将它们包装为Actions并将其添加到队列中,但这不会等到Actions完成执行后再启动下一个,而且尽管它们确实正确地调用了服务,但不会向调用ViewModel返回任何数据。
WCF服务可以处理大量调用,但为了避免拒绝服务攻击,默认情况下可以处理的请求数量是有限的。
Silverlight WCF服务的主要限制是
- 来自同一IP地址的两个同时呼叫的默认限制
- 并发连接的限制约为10-16个(文档对此有所不同)
CodeProject的这篇关于提高ASP.NET、WCF和桌面客户端性能和可扩展性的快速方法的文章非常有用。
我猜你马上就要抓住第一个问题了。在WCF配置中,您需要添加以下内容来增加单个IP连接:
<system.net>
<connectionManagement>
<add address="*" maxconnection="100" />
</connectionManagement>
</system.net>
然后,您可能会达到解决方案调整web/app.config文件中的服务行为的第二个限制。
以下是我在自己整理这些问题时发现的更多参考资料:
- http://weblogs.asp.net/paolopia/archive/2008/03/23/wcf-configuration-default-limits-concurrency-and-scalability.aspx
- 为什么WCF将并发连接限制为5
- http://msdn.microsoft.com/en-us/magazine/cc163590.aspx#S10
- http://blogs.msdn.com/b/stcheng/archive/2009/01/06/wcf-things-that-will-impact-concurrency-capacity-behavior-of-wcf-service-with-simoultaneous-client-requests-connections.aspx
- http://www.codeproject.com/Articles/133738/Quick-Ways-to-Boost-Performance-and-Scalability-of
- http://www.danrigsby.com/blog/index.php/2008/02/20/how-to-throttle-a-wcf-service-help-prevent-dos-attacks-and-maintain-wcf-scalability/
- http://msdn.microsoft.com/en-us/library/7w2sway1%28v=vs.71%29.aspx
- http://www.codeproject.com/Articles/89858/WCF-Concurrency-Single-Multiple-and-Reentrant-and
- WCF在大约10次调用后停止响应(限制)