【问题标题】:Resolve blocking issues when simultaneously calling multiple methods on a WCF service from Silverlight解决从 Silverlight 同时调用 WCF 服务上的多个方法时的阻塞问题
【发布时间】:2010-07-13 06:54:38
【问题描述】:

我刚刚阅读了这篇关于同时从 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-service 并且您启用了 Asp.Net 会话状态,调用将由服务按顺序执行,因此任何长时间运行的调用都会阻塞后续调用。"

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

针对 SL3 中问题的建议解决方案包括在 Application_Startup 方法中使用以下语法:

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

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

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

【问题讨论】:

    标签: asp.net silverlight wcf blocking


    【解决方案1】:

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

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

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

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

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

    更新:做一些文档阅读:

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

    Wenlong Dong's site 上有一篇很好的博客文章

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

    【讨论】:

    • 但是托管在浏览器中的 Silverlight 应用程序呢?
    • 但这就是重点:除非您使用 silverlight HTTP 堆栈(根据上面的链接),否则浏览器中的 Silverlight就像浏览器一样工作
    • 点了。我试图通过在服务类上使用: [AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.NotAllowed)] 使其中一项服务无状态。这不起作用,可能是由于以下 web.config 行: 我们需要在 web.config 文件中使用它,因为还有其他需要维护状态的服务。我认为唯一的解决方案可能是在前面提到的单独的 asp.net 应用程序中拥有某些服务(那些容易被阻塞的服务)。
    • 我注意到文龙文章中的以下文字:“除了应用程序级别的标志 aspNetCompatibilityEnabled 之外,用户仍然需要通过使用服务属性 AspNetCompatibilityRequirements [ ServiceBehavior] [AspNetCompatibilityRequirements(RequirementsMode=AspNetCompatibilityRequirementsMode.Allowed)] RequirementsMode 可以有三个不同的值:NotAllowed、Allowed 或Required。默认值为 NotAllowed。"
    • 我没有在我的任何服务类上使用 AspNetCompatibilityRequirements 属性。这表明会话状态默认为关闭?
    【解决方案2】:

    在 .NET 4 中,您可以在 Application_BeginRequest 中执行此操作

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-04-20
      • 1970-01-01
      相关资源
      最近更新 更多