我创建了一个将.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远离所有这些的全部抽象)
所以,我的问题是,我应该为每个调用创建一个新的代理实例吗?旧代理是否会自行清理(似乎没有任何关闭等)
提前感谢您的任何建议!
答案 0 :(得分:0)
每次调用都使用新客户端是安全的,并在操作完成后立即将其处理,以最大限度地减少内存占用。 ClientBase<TChannel>
实现了IDisposable,因此我将使用block(因此当执行离开块时客户端将被释放)。如果你不处理代理.net有一天会处理它。但是你冒着重负荷的风险,你的代理(未使用但尚未处理)将达到可以用服务器打开的连接限制,你最终可能会遇到已经达到最大打开连接数的例外情况。
使用块与WCF客户端here有一些指导原则。
每次调用使用一个代理的恕我直言都不安全,因为ClientBase<TChannel>
不是线程安全的(我假设你的代理可以被多个线程/用户同时调用)。如果仍然采用这种方式,则必须锁定对代理的访问权限,从而序列化对它的访问。这会导致性能下降甚至超时。所以我绝对不会这样使用它。