Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/silverlight/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net 解决从Silverlight对WCF服务同时调用多个方法时的阻塞问题_Asp.net_Silverlight_Wcf_Blocking - Fatal编程技术网

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

Asp.net 解决从Silverlight对WCF服务同时调用多个方法时的阻塞问题,asp.net,silverlight,wcf,blocking,Asp.net,Silverlight,Wcf,Blocking,我刚刚从Silverlight阅读了这篇关于同时调用WCF服务上的多个方法的有趣文章: 文章说:“事实证明,这个问题是在Silverlight、Asp.Net和WCF的混合中发现的,基本上,如果您对一个单个WCF web服务进行多个调用,并且启用了Asp.Net会话状态,则调用将由服务按顺序执行,因此任何长时间运行的调用都将阻止后续调用。” 我假设阻塞只是一个问题,如果您对同一个服务进行多个调用,并且两个不同服务上同时调用两个不同方法不应导致一个阻塞另一个 SL3中问题的建议解决方案包括在应用

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

文章说:“事实证明,这个问题是在Silverlight、Asp.Net和WCF的混合中发现的,基本上,如果您对一个单个WCF web服务进行多个调用,并且启用了Asp.Net会话状态,则调用将由服务按顺序执行,因此任何长时间运行的调用都将阻止后续调用。”

我假设阻塞只是一个问题,如果您对同一个
服务进行多个调用,并且两个不同服务上同时调用两个不同方法不应导致一个阻塞另一个

SL3中问题的建议解决方案包括在应用程序启动方法中使用以下语法:

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

然后,必须在WCF调用上维护会话状态,方法是设置一个cookie容器,并在所有代理中共享它(请参阅)


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

如果您正在调用ASP.Net应用程序,并且正在使用会话cookies,则所有对该应用程序的调用都将被序列化(页面明确选择脱离会话状态的调用除外)

通常这不是什么大问题,因为客户端浏览器通常会访问ASP.Net页面加上一堆资源(图像、js、css等),而这些资源没有映射到ASP.Net,所以IIS会以本机方式提供这些资源。但是,如果您尝试同时点击两个ASP.Net页面(例如在框架集中),您将看到它们一个接一个地加载

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

在ASP.Net中,您可以逐页“选择退出”会话状态。如果托管的WCF服务可以这样做,并且您的场景(使服务成为无状态)也可以这样做,那么就可以解决这个问题。或将一个或多个服务移动到其他ASP.Net应用程序(不同会话)

请记住,您可以在这里看到与服务的实例和重入模型相关的其他问题。如上所述,您的问题是每个用户的并发性问题,但还有其他问题。例如,如果将服务设置为单例(InstanceContextMode.Single)和不可重入(ConcurrencyMode.Single),则所有用户一次只能处理一个请求

更新:进行一些文档阅读:

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


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

在.Net 4中,您可以在
应用程序\u BeginRequest

if (Context.Request.Path.EndsWith("xxx.svc"))
   Context.SetSessionStateBehavior(SessionStateBehavior.Disabled);

但对于浏览器中托管的Silverlight应用程序呢?但这就是问题所在:除非您使用Silverlight HTTP堆栈(根据上面的链接),否则浏览器中的Silverlight与浏览器一样工作。我试图通过在服务类上使用:[AspNetCompatibilityRequirements(RequirementsMode=AspNetCompatibilityRequirementsMode.NotAllowed)]使其中一个服务成为无状态。这不起作用,可能是由于以下web.config行:我们需要在web.config文件中使用它,因为还有其他需要维护状态的服务。我认为唯一的解决方案可能是,如前所述,在单独的asp.net应用程序中提供某些服务(那些容易被阻塞的服务)。我注意到文龙文章中的以下内容:“除了应用程序级标志aspNetCompatibilityEnabled外,用户还需要使用服务属性AspNetCompatibilityRequirements[ServiceBehavior][AspNetCompatibilityRequirements(RequirementsMode=AspNetCompatibilityRequirementsMode.Allowed)]明确选择WCF服务上的兼容模式。”RequirementsMode可以有三个不同的值:NotAllowed、Allowed或Required。不允许使用默认值。“我没有在任何服务类上使用AspNetCompatibilityRequirements属性。这表示会话状态默认为关闭?