C# WCF、通道工厂和例外

C# WCF、通道工厂和例外,c#,vb.net,wcf,wcf-client,C#,Vb.net,Wcf,Wcf Client,使用vs2008、vb.net、C#、FW3.5 我在我的客户中使用我的服务 服务托管在IIS中 客户端(winforms MDI)是使用svcutil使用/l、/r、/ct和/n开关生成的 服务和客户端都使用MyEntities.dll 我正在将nettcp与TransportWithMessageCredential一起使用 我将代理缓存在主窗体中 if Membership.ValidateUser(UsernameTextBox.Text, PasswordTextBox.Text)

使用vs2008、vb.net、C#、FW3.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"
然后,我将_代理传递给需要使用它的任何子表单/插件 前

一切都很顺利,但我的问题是:

通话后频道会发生什么变化?他们被魔法处置了吗

我怎样才能用探查器监视这个

有没有一种方法可以在一个地方进行错误处理,或者我需要在每个调用中放置try/catch,比如

我可以订阅_proxy.InnerChannel.Faulted并在那里进行清理吗

问候


_Eric

附加测试结果/注释

似乎我已经部分回答了我自己的问题,我运行了500次循环

 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、关闭和处置,或者对于我进行的每个调用,只需将其包装在一次尝试中,然后捕获超时/通信/故障异常,将代理保留,但处置该通道?如果是后者,有没有一种方法可以封装它

问候


_Eric

我通常做两件不同的事情,具体取决于用例:

  • 在我知道一次只使用一个通道实例的客户端场景中,我创建了一个通道,然后重新使用创建的实例。如果发生故障、关闭或处置,将重新创建通道
  • 在可以同时请求多个通道的场景中,我认为最好进行异常处理。为了避免代码膨胀,您可以将其集中到一个方法中,该方法接受委托完成的实际工作,以便它在有效负载代码周围形成一个一次写入的外骨骼

对于dispose问题,除非您在代理上调用dispose,否则代理不会被神奇地释放。频道呢?在客户端退出之前,我不想处置代理。它会回到池中吗?我同意“异常处理舞蹈”。我最终使用了codeplex中的异常处理WCF代理生成器。
 List(of Orders) =  _proxy.ChannelFactory.CreateChannel.GetOrders(customer)
  Dim channel = _proxy.ChannelFactory.CreateChannel
     e.result = Channel.GetOrders(customer)
     Dim Ich = DirectCast(channel, ServiceModel.IClientChannel)
     Ich.Close()
     Ich.Dispose()