相关疑难解决方法(0)

WCF客户端"使用"块问题的最佳解决方法是什么?

我喜欢在using块中实例化我的WCF服务客户端,因为它几乎是使用实现的资源的标准方法IDisposable:

using (var client = new SomeWCFServiceClient()) 
{
    //Do something with the client 
}
Run Code Online (Sandbox Code Playgroud)

但是,正如本MSDN文章中所述,在using块中包装WCF客户端可能会掩盖导致客户端处于故障状态的任何错误(如超时或通信问题).简而言之,当调用Dispose()时,客户端的Close()方法会触发,但会因为处于故障状态而抛出错误.然后,第二个异常掩盖了原始异常.不好.

MSDN文章中建议的解决方法是完全避免使用using块,而是实例化您的客户端并使用它们,如下所示:

try
{
    ...
    client.Close();
}
catch (CommunicationException e)
{
    ...
    client.Abort();
}
catch (TimeoutException e)
{
    ...
    client.Abort();
}
catch (Exception e)
{
    ...
    client.Abort();
    throw;
}
Run Code Online (Sandbox Code Playgroud)

与using块相比,我认为这很难看.每次需要客户端时都需要编写很多代码.

幸运的是,我发现了一些其他的解决方法,例如IServiceOriented上的这个.你从:

public delegate void UseServiceDelegate<T>(T proxy); 

public static class Service<T> 
{ 
    public static ChannelFactory<T> _channelFactory = new ChannelFactory<T>(""); 

    public static void Use(UseServiceDelegate<T> codeBlock) 
    { …
Run Code Online (Sandbox Code Playgroud)

c# vb.net wcf using wcf-client

400
推荐指数
10
解决办法
11万
查看次数

WCF ChannelFactory State属性

ChannelFactory拥有State属性意味着什么?我知道创建的频道可以具有基于连接的状态.但我很困惑为什么ChannelFactory也有这样的连接状态.它是否也连接到WCF服务?

c# wcf state channel channelfactory

10
推荐指数
2
解决办法
4333
查看次数

ChannelFactory.Open VS IClientChannel.Open

我试图更好地理解WCF的一些内部工作原理.我已经做了相当多的环顾四周,但是我无法找到ChannelFactory.Open()与之相比的明确解释IClientChannel.Open().开工厂的目的是什么?如果正在使用该通道进行通信,那么在创建和打开通道后,工厂将在该过程中播放哪个部分?

有人问在这里,其他的问题之一,但从来没有直接回答.

编辑:

在对源代码进行反编译之后,我发现了需要在ChannelFactory上调用Open的一些具体原因,如下所述.

我仍然无法理解的是,为什么这项工作是通过ICommunicationObject提供的机制完成的,当工厂实际上没有与任何东西进行通信时(据我所知).为什么不在构造或处理对象时处理这些事情?

我想我可能已经远远不够杂草,这样的答案可能无法公开.感谢那些权衡原始问题的人.

.net c# wcf wcf-client

7
推荐指数
2
解决办法
3290
查看次数

标签 统计

c# ×3

wcf ×3

wcf-client ×2

.net ×1

channel ×1

channelfactory ×1

state ×1

using ×1

vb.net ×1