我是否应该在每次调用时创建一个新的.net 4.5.1 WFC客户端代理

时间:2014-04-28 03:21:04

标签: wcf

我创建了一个将.net到.net通信的应用程序。根据我的理解,使用TCP是优化的方法。

我使用“添加服务”创建了代理。在Dev studio中引用,并按如下方式打开..

 NetTcpBinding tcp = new NetTcpBinding();
 string endPoint = string.Format("net.tcp://{0}:{1}/{2}", m_configuration.IpAddress,
          m_configuration.Port, ServicesEndpointId);
 m_proxy = new ProxyClient(tcp, new EndpointAddress(endPoint));         

目前,我正在创建此代理的单个实例,并且只是重用每次调用它。我有一个异常处理程序,并处理一个EndpointNotFoundException,当其他服务器端可能没有启动并运行时(很可能)

当我最初使用http(不是tcp)时,这一切都运行正常,但现在,如果服务器关闭,或者甚至在一些空闲时间之后,我似乎得到以下异常......

System.ServiceModel.CommunicationObjectFaultedException

我发现其他一些帖子提到使用频道工厂等等,还有一个提到使用的帖子

proxyInstance.InnerChannel.Faulted += new EventHandler(ProxyFaulted);

但是我的代理上没有InnerChannel,而其他频道的东西似乎很低级别(更像是远程使用 - 我喜欢使用WCF远离所有这些的全部抽象)

所以,我的问题是,我应该为每个调用创建一个新的代理实例吗?旧代理是否会自行清理(似乎没有任何关闭等)

提前感谢您的任何建议!

1 个答案:

答案 0 :(得分:0)

每次调用都使用新客户端是安全的,并在操作完成后立即将其处理,以最大限度地减少内存占用。 ClientBase<TChannel>实现了IDisposable,因此我将使用block(因此当执行离开块时客户端将被释放)。如果你不处理代理.net有一天会处理它。但是你冒着重负荷的风险,你的代理(未使用但尚未处理)将达到可以用服务器打开的连接限制,你最终可能会遇到已经达到最大打开连接数的例外情况。

使用块与WCF客户端here有一些指导原则。

每次调用使用一个代理的恕我直言都不安全,因为ClientBase<TChannel>不是线程安全的(我假设你的代理可以被多个线程/用户同时调用)。如果仍然采用这种方式,则必须锁定对代理的访问权限,从而序列化对它的访问。这会导致性能下降甚至超时。所以我绝对不会这样使用它。