我有一个调用WCF服务的ASP.NET MVC应用程序。以下是我每次请求时的调用方式。
var xml = "my xml string";
var ep = new EndpointAddress("http://myendpoint");
xml = new Proxy.ServiceClient(new NetTcpBinding(), ep).getNewXML(new Proxy.CallContext(), xml);
我遇到的问题是请求数量而不是回收。
使用性能监视器查看下面的屏幕截图。我通过在服务器上打开Web浏览器并按住enter(每个请求执行表单发布然后尝试调用代理客户端)来运行此测试。
此时,Web浏览器只是旋转,直到实例开始丢弃。这通常需要大约30秒,但在服务器上执行大量活动时会导致问题。我该怎么做才能防止它达到100%?
答案 0 :(得分:2)
客户端代理类是一次性的 - 具有IDisposable,因为连接是应该尽快处理的资源。在您的代码中,您似乎没有在使用后处置代理对象。进行客户端调用的常见代码模式是这样的。
using (var proxy= new MyProxyClass(...))
{
proxy.DoSomething(...);
}
客户端资源泄漏可能会导致客户端和服务器端出现严重的性能问题。由于您的MVC应用程序(Web服务代理)是WCF服务的客户端,因此对整体性能的损害正在升级。
答案 1 :(得分:2)
您应该在完成使用后立即关闭代理。在一次性WCF客户端代理的情况下,不建议使用using
语句,因为他们的Dispose()
方法可能会抛出异常。有关详细信息,请参阅here。
这样的东西就足够了:
var client = new MyServiceClient();
try
{
client.Open();
client.MyServiceCall();
client.Close();
}
catch (CommunicationException e)
{
...
client.Abort();
}
catch (TimeoutException e)
{
...
client.Abort();
}
catch (Exception e)
{
...
client.Abort();
throw;
}