我正在尝试研究另一位开发者报告的问题。他声称,当我们创建的Silverlight应用程序遇到并发呼叫时,硬件点击WCF Web服务时,调用开始堆叠在服务器上。他声称我们正在使用会话,因为我们正在使用的身份验证方法(使用表单和asp.net的asp.net成员资格)。所以我创建了一个非常简单的测试应用程序
该应用程序允许我指定我想要的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>
答案 0 :(得分:2)
6个并发连接限制听起来像是IE强制执行的最大值。
您没有指定IE版本,但这里是IE8的参考,包括更改限制的说明:Connectivity Enhancements in Windows Internet Explorer 8
我会尝试使用限制,看看它是否会影响你的结果。
答案 1 :(得分:2)
好的帮助我找到了我需要的解释。
他可能不是。在我的测试期间,我需要将服务的属性更改为以下内容,以便能够重现问题。
[ServiceBehavior(ConcurrencyMode = ConcurrencyMode.Single, InstanceContextMode = InstanceContextMode.Single)]
这会强制创建单个服务实例,然后堆叠并发调用。最初我有attibutes
[ServiceBehavior(ConcurrencyMode = ConcurrencyMode.Single, InstanceContextMode = InstanceContextMode.PerSession)]
这将专门为每个新会话创建一个新服务。但是我还发现每个调用都是一个新的会话,这是因为我们使用的是不支持会话的BasicHttpBinding。
正如boris所提到的,这很可能是浏览器的限制,后来是我们使用的客户端堆栈。虽然我没有设法改变设置,看看是否有所作为,但在两种情况下,数字6始终出现是完全合理的。
我真的对此没有坚定的想法,并欢迎其他人的意见。