使用vs2008,vb.net,C#,fw 3.5
我在我的客户端使用我的服务
服务托管在IIS中
客户端(winforms MDI)使用svcutil使用/ l,/ r,/ ct和/ n开关生成
服务和客户端都使用MyEntities.dll
我正在使用nettcp与TransportWithMessageCredential我在主窗体中缓存代理
if Membership.ValidateUser(UsernameTextBox.Text, PasswordTextBox.Text)
_proxy = new MyServiceClient
_proxy.ClientCredentials.UserName.UserName = "username"
_proxy.ClientCredentials.UserName.Password = "password"
然后我将_proxy传递给任何需要使用它的子表单/插件
List(of Orders) = _proxy.ChannelFactory.CreateChannel.GetOrders(customer)
一切都很好,但我的问题是这样的:
通话结束后 Channels 会发生什么?他们神奇地处置了吗?
我怎么能用探查器监控这个?
有没有办法可以在一个地方进行错误处理,或者我需要在每个调用中放置try / catch,如What is the best workaround for the WCF client using
block issue?
try
{
...
client.Close();
}
catch (CommunicationException e)
{
...
client.Abort();
}
catch (TimeoutException e)
{
...
client.Abort();
}
catch (Exception e)
{
...
client.Abort();
throw;
}
我可以订阅_proxy.InnerChannel.Faulted并在那里清理吗?
问候
_Eric
2 回答
我根据用例使用两种不同的东西:
在一个客户端场景中,我知道一次只使用一个通道实例,我懒惰 - 创建一个通道,并重新使用创建的实例 . 如果出现故障,关闭或处置,则重新创建通道 .
在可以同时请求多个 Channels 的情况下,我认为最好是进行异常处理舞蹈 . 为了避免代码膨胀,您可以将其集中到一个方法中,该方法接受它完成的实际工作的委托,以便它围绕您的有效负载代码形成一次写入外骨骼 .
附加测试结果/说明
似乎我已经部分回答了我自己的问题,我为500 X运行了一个循环
这是非常邪恶的,并且在第11次迭代开始时得到了超时错误,这是我的服务的最大用户(10) . 这是否意味着有人可以实现任何wcf客户端并打开与wcf服务器允许的一样多的通道?
我确实发现这给了我预期的结果并完成了所有500次迭代
我现在的问题是,我可以在_proxy.InnerChannel.Faulted事件中进行casttochannel,关闭和处理,或者对于每次调用我只是将它包装在try中,然后捕获超时/ comm / fault异常,让代理处理但是处理通道?如果后者是这种情况有没有办法封装这个?
问候
_Eric