Silverlight并发WCF

时间:2012-09-04 08:22:32

标签: wcf silverlight concurrency

我正在尝试研究另一位开发者报告的问题。他声称,当我们创建的Silverlight应用程序遇到并发呼叫时,硬件点击WCF Web服务时,调用开始堆叠在服务器上。他声称我们正在使用会话,因为我们正在使用的身份验证方法(使用表单和asp.net的asp.net成员资格)。所以我创建了一个非常简单的测试应用程序

Screen shot of test application

该应用程序允许我指定我想要的Web服务的并发呼叫数,然后指示当前未完成的呼叫数和平均响应时间(以秒为单位)。

Web服务本身只是让线程休眠第二次

    public void DoWork()
    {
        Thread.Sleep(1000);
    }

所以我认为会发生的事情是,如果我的同事是对的,那么呼叫将堆叠在服务器上,因此如果有两个并发呼叫,平均响应将是2秒。然而,似乎发生的事情是,时间保持在一秒钟以上,直到我达到七个并发请求,然后它开始相对可预测地增加。

运行第二个客户端(在初始IE窗口旁边的Chrome窗口中)似乎不会影响性能(存在初始打嗝)。如果您并排运行两个IE或两个Chrome,则情况并非如此,那么这两个似乎相互影响,表明他们正在共享连接。

似乎小提琴手正在干涉。我在没有fiddler的情况下运行了7个并发呼叫的应用程序,每个呼叫平均大约1.15秒。然后我开始提琴手,时间缩短到一秒钟以上,就好像小提琴手允许额外的电话通过。

所以我的问题。这里发生了什么?在哪里进行限制(在6个并发请求中)(客户端或服务器)?为什么运行fiddler可以加快请求速度?

一些额外的信息。

Web服务类有几个属性

[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Required)]
[ServiceBehavior(ConcurrencyMode = ConcurrencyMode.Single, InstanceContextMode = InstanceContextMode.PerSession)]
public class DoVeryLittle : IDoVeryLittle
{
    public void DoWork()
    {
    }
}

AspNetCompatibilityRequirements旨在允许与asp.net管道和身份验证集成。 ServiceBehavour的ConcurrencyMode和InstanceContextMode显然是为每个会话创建和实例。但是我们使用basicHttpBinding作为端点,我发现这不支持会话,所以我对此有点困惑。

为了完整起见,这里是web.config中与服务相关的条目

<system.serviceModel>
    <behaviors>
        <serviceBehaviors>
            <behavior name="">
              <serviceMetadata httpGetEnabled="true" />
              <serviceDebug includeExceptionDetailInFaults="true" />
              <serviceAuthorization principalPermissionMode="UseAspNetRoles" roleProviderName="AspNetSqlRoleProvider" />
            </behavior>
        </serviceBehaviors>
    </behaviors>
  <serviceHostingEnvironment aspNetCompatibilityEnabled="true" multipleSiteBindingsEnabled="true" />
</system.serviceModel>

2 个答案:

答案 0 :(得分:2)

6个并发连接限制听起来像是IE强制执行的最大值。

您没有指定IE版本,但这里是IE8的参考,包括更改限制的说明:Connectivity Enhancements in Windows Internet Explorer 8

我会尝试使用限制,看看它是否会影响你的结果。

答案 1 :(得分:2)

好的帮助我找到了我需要的解释。

  • 为什么我的同事遇到并发WCF呼叫的问题?

他可能不是。在我的测试期间,我需要将服务的属性更改为以下内容,以便能够重现问题。

[ServiceBehavior(ConcurrencyMode = ConcurrencyMode.Single, InstanceContextMode = InstanceContextMode.Single)]

这会强制创建单个服务实例,然后堆叠并发调用。最初我有attibutes

[ServiceBehavior(ConcurrencyMode = ConcurrencyMode.Single, InstanceContextMode = InstanceContextMode.PerSession)]

这将专门为每个新会话创建一个新服务。但是我还发现每个调用都是一个新的会话,这是因为我们使用的是不支持会话的BasicHttpBinding。

  • 为什么有6个并发呼叫的限制?

正如boris所提到的,这很可能是浏览器的限制,后来是我们使用的客户端堆栈。虽然我没有设法改变设置,看看是否有所作为,但在两种情况下,数字6始终出现是完全合理的。

  • 为什么提琴手会改变这个?

我真的对此没有坚定的想法,并欢迎其他人的意见。