使用vs2008,vb.net,C#,fw 3.5
我在客户端使用我的服务
服务托管在IIS
中使用/ 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)
一切都很好但我的问题是:
通话结束后频道会怎样?他们是否神奇地处置?
我怎样才能使用分析器来监控它?
我是否可以在一个地方进行错误处理,或者我是否需要在What is the best workaround for the WCF client `using` block issue?
等每次调用中放置try / catchtry
{
...
client.Close();
}
catch (CommunicationException e)
{
...
client.Abort();
}
catch (TimeoutException e)
{
...
client.Abort();
}
catch (Exception e)
{
...
client.Abort();
throw;
}
我可以订阅_proxy.InnerChannel.Faulted并在那里清理吗?
此致
_Eric
答案 0 :(得分:2)
我根据用例使用两种不同的东西:
答案 1 :(得分:1)
其他测试结果/备注
似乎我已经部分回答了我自己的问题,我为此运行了500 X
List(of Orders) = _proxy.ChannelFactory.CreateChannel.GetOrders(customer)
这是非常邪恶的,并且在第11次迭代开始时得到了超时错误,这是我的服务的最大用户(10)。这是否意味着有人可以实现任何wcf客户端并打开wcf服务器允许的多个频道?
我确实发现这给了我预期的结果并完成了所有500次迭代
Dim channel = _proxy.ChannelFactory.CreateChannel
e.result = Channel.GetOrders(customer)
Dim Ich = DirectCast(channel, ServiceModel.IClientChannel)
Ich.Close()
Ich.Dispose()
我的问题是现在 我可以在_proxy.InnerChannel.Faulted事件中进行casttochannel,关闭和处理,或者对于我做的每次调用,只是将它包装在try中然后捕获超时/ comm / fault异常,让代理处理但是处理通道?如果后者是这种情况,有没有办法封装这个?
此致
_Eric