我有一个相当简单的 WCF Web 服务,使用 .Net 3.5 托管在 IIS Express(最终成为完整的 IIS)中。服务方法相当无趣。
[ServiceContract]
public class MySvc
{
[OperationContract]
public Stuff MyMethod(string input)
{
Stuff result = DoSomething();
return result;
}
}
服务配置也相当通用:
<system.serviceModel>
<services>
<service behaviorConfiguration="MySvcBehavior" name="MySvc">
<endpoint address="" binding="wsHttpBinding" contract="MySvc">
<identity>
<dns value="localhost"/>
</identity>
</endpoint>
<endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange"/>
</service>
</services>
<behaviors>
<serviceBehaviors>
<behavior name="MySvcBehavior">
<serviceMetadata httpGetEnabled="true"/>
<serviceDebug includeExceptionDetailInFaults="false"/>
</behavior>
</serviceBehaviors>
</behaviors>
</system.serviceModel>
该服务由 ASPX 应用程序中的代码隐藏使用。有一个服务参考,导致一些同样无趣的代码。
MySvcClient svc = new MySvcClient();
Stuff result = svc.MyMethod("foo");
只要一次一个请求,一切正常,客户端代码得到预期的结果。耶。
当我进行一些非常原始的压力测试时,问题就来了。我在浏览器中加载客户端 ASPX 页面,然后按住 F5 键。观察 IIS Express 窗口,起初结果返回状态 200,但几分钟后我开始看到状态 500。此时,服务只会响应状态 500,直到我重新启动 IIS Express。(基于等待大约 10 分钟。)
在客户端代码中设置断点,我看到完整的返回消息是“服务器上有太多待处理的安全对话。请稍后重试。”
在服务器代码中设置断点,我发现我的代码甚至没有被调用。所以它在调用和我的代码的实际开始之间的某个地方失败了。
我的在线搜索并不是很有希望,主要导致编写自定义绑定以覆盖 maxPendingSessions 属性和一个以“有人告诉我有一个 [未命名] 配置文件设置”开头的线程的相同建议,然后导致声称微软承认这是一个错误的链接断开。
关于 maxPendingSessions 属性的链接确实提到了 128 个连接的限制,超时时间为两分钟,我当然可以看到我的测试方法将在哪里中断一些连接。这是公认的糟糕测试方法的预期结果吗?或者可以在配置中做些什么来改善这一点?