4

使用 vs2008、vb.net、C#、fw 3.5

我在我的客户中使用我的服务

服务托管在 IIS 中

客户端(winforms MDI)是使用 svcutil 使用 /l、/r、/ct 和 /n 开关生成的

服务和客户端都使用 MyEntities.dll

我正在使用带有 TransportWithMessageCredential 的 nettcp 我在主窗体中缓存代理

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)

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

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

我怎么能用探查器来监控呢?

有没有一种方法可以在一个地方进行错误处理,或者我是否需要在每个调用中放置 try/catch,例如WCF 客户端“使用”块问题的最佳解决方法是什么?

try
{
    ...
    client.Close();
}
catch (CommunicationException e)
{
    ...
    client.Abort();
}
catch (TimeoutException e)
{
    ...
    client.Abort();
}
catch (Exception e)
{
    ...
    client.Abort();
    throw;
}

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

问候

_埃里克

4

2 回答 2

2

根据用例,我用来做两件不同的事情:

  • 在我知道一次只使用一个通道实例的客户端场景中,我懒惰地创建一个通道,然后重新使用创建的实例。如果它发生故障、关闭或处置,则重新创建通道。
  • 在可以同时请求多个通道的场景中,我认为最好是做异常处理舞。为了避免代码膨胀,您可以将其集中到一个方法中,该方法接受委托来完成它所完成的实际工作,以便它围绕您的有效负载代码形成一次写入外骨骼。
于 2010-02-05T12:52:48.473 回答
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 事件中进行强制转换、关闭和处理,或者对于我所做的每次调用,只需将其包装在 try 中,然后捕获超时/通信/故障异常,让代理成为但处理通道?如果是后者,有没有办法封装这个?

问候

_埃里克

于 2010-02-02T21:21:16.897 回答