从Silverlight同时调用WCF服务上的多个方法时解决阻塞问题

时间:2010-07-13 06:54:39

标签: asp.net silverlight wcf blocking

我刚读过这篇有趣的文章,关于在Silverlight上同时调用WCF服务上的多个方法:

http://weblogs.asp.net/olakarlsson/archive/2010/05/20/simultaneously-calling-multiple-methods-on-a-wcf-service-from-silverlight.aspx

文章指出:“事实证明,问题是在Silverlight,Asp.Net和WCF的混合中建立的,基本上如果你正在多次调用单个 WCF如果启用了Web服务,并且启用了Asp.Net会话状态,则服务将按顺序执行调用,因此任何长时间运行的调用都将阻止后续调用。“

我假设阻止只是一个问题,如果您多次调用相同服务,并且两个不同服务上的两个不同方法的两个同时调用不应导致一个阻止另一个?

SL3中问题的建议解决方案涉及在Application_Startup方法中使用以下语法:

WebRequest.RegisterPrefix(“http://”,WebRequestCreator.ClientHttp);

然后,必须通过设置cookie容器并在所有代理中共享它来在WCF调用上维护会话状态(请参阅http://forums.silverlight.net/forums/p/174322/393032.aspx

这仍然是Silverlight 4中推荐的解决方案吗?有没有人使用过替代方法?

2 个答案:

答案 0 :(得分:3)

如果您正在调用ASP.Net应用程序,并且您正在使用会话cookie,那么所有对应用程序的调用将被序列化(除了页面明确选择退出的情况之外)会话状态)。

通常这不是一个大问题,因为客户端浏览器通常会访问ASP.Net页面加上一堆资源(图像,js,css等...),而后者未映射到ASP.Net 所以IIS本地服务它们。但是如果你尝试同时点击两个ASP.Net页面(例如在框架集中),你会看到它们一个接一个地加载。

现在我知道这种情况发生在WCF上,但根据你所说的,如果你看到一个服务的行为,我希望看到所有这些,因为会话是按用户进行的,而不是按服务进行的。

在ASP.Net中,您可以逐页“选择退出”会话状态。如果这对于托管的WCF服务是可能的,并且对于您的场景(使服务无状态)可行,这将缓解该问题。或者将一个或多个服务移动到不同的ASP.Net应用程序(不同的会话)

请记住,您可以在此处查看与服务的实例化和重入模型有关的其他问题。您上面描述的问题是每用户并发问题,但还有其他问题。例如,如果将服务设置为单例(InstanceContextMode.Single)和非重入(ConcurrencyMode.Single),那么将在所有用户中一次只处理一个请求。

更新:做一些doco阅读:

  • 除非您要求(使用)
  • ,否则WCF服务不会注册到ASP.Net会话中
  • WCF服务可以在每个服务的基础上选择使用服务实现的[AspNetCompatibilityRequirements]属性
  • 似乎没有任何选择,但没有选择进入会话状态。

Wenlong Dong's site

上有关于此的好文章

因此,从我所看到的,您应该能够使用AspNetCompatibilityRequirementsMode.NotAllowed从ASP.Net服务中完全退出单个服务。或者,默认情况下将其关闭,并且只选择需要访问ASP.Net会话的那些(请记住,除非您确实需要与ASP.Net共享相同的会话,否则只使用WCF的会话服务可能是更好的赌注)。

答案 1 :(得分:3)

在.NET 4中,您可以在Application_BeginRequest

中执行此操作
if (Context.Request.Path.EndsWith("xxx.svc"))
   Context.SetSessionStateBehavior(SessionStateBehavior.Disabled);