我正在尝试编写一些单元测试(实际上是更多集成测试)来命中托管我的WCF服务的实时IIS服务器。每当我运行测试时,如果我的一个Assert语句在客户端失败,我的WCF服务似乎锁定了 - 我必须做一个iisreset来重新上线。
例如,我在测试方法中有3个从我的服务客户端调用到WCF服务 - Call1,Call2和Call3。第一次,Call1工作得很好,Call2工作得很好,然后Call3激活Assert,因为有些数据不正确。在下一次测试中,Call1失败并出现以下错误:
“mscorlib.dll中发生了'System.ServiceModel.CommunicationException'类型的异常,但未在用户代码中处理
其他信息:收到http://localhost/Kiosk/KioskSite.svc的HTTP响应时发生错误。这可能是由于服务端点绑定不使用HTTP协议。这也可能是由于服务器中止HTTP请求上下文(可能是由于服务关闭)。有关详细信息,请参阅服务器日志。“
做完iisreset后,一切都还好。
任何人都有任何想法可能会发生什么?
答案 0 :(得分:1)
如果您必须重新启动IIS,那么您的服务中的状态管理似乎就会出现问题。您的测试是一次成功的测试,因为它暴露了这个问题 - 一个行为不端的客户端可以冻结服务。
我可以建议您在调查中尝试三件事:
1)为您的服务创建一个控制台主机,看看问题是否仍然存在。这将确定它是否是IIS问题。
2)使用服务行为更改服务的并发模式。
[ServiceBehavior(ConcurrencyMode=ConcurrencyMode.Multiple,UseSynchronizationContext=false)]
class MyServiceImplementation : IMyService
{
// ...
}
3)确保您在创建的任何代理上调用Close,即使测试失败也是如此。服务一次只能连接有限数量的代理。 (默认值为10)
[Test]
void ATestMethod()
{
MyService proxyInstance = new MyService();
try
{
Assert.IsTrue(proxyInstance.MethodC());
}
finally
{
proxyInstance.Close();
}
}
答案 1 :(得分:0)
这些听起来不像单元测试。单元测试隔离了代码片段并单独测试它们,听起来你正在编写集成测试。
为什么你要测试WCF调用你不能单独测试服务器端方法而不用担心WCF?