2009-07-30 134 views
5

我有一个使用WCF服务(WSHttpBinding)的mvc控制器类,有时会在一个http请求中多次调用,并且想知道为该服务创建客户端的成本。可以为每个调用创建客户端实例,还是应该在类中创建成员变量?WCF客户端实例化

public class RingbacksController : Controller 
{ 
    private void LoadContactsIntoViewData(int page) 
    { 
       RingbackServiceClient client = new RingbackServiceClient(); 
     ... 
     client.Close(); 
    } 

    private void LoadGroupsIntoViewData(int page) 
    { 
       RingbackServiceClient client = new RingbackServiceClient(); 
     ... 
     client.Close(); 
    } 
} 

public class RingbacksController : Controller 
{ 
    private RingbackServiceClient client = new RingbackServiceClient(); 

    private void LoadContactsIntoViewData(int page) 
     { 
     ... 
     client.Close(); 
    } 

    private void LoadGroupsIntoViewData(int page) 
    { 
     ... 
     client.Close(); 
    } 
} 

回答

1

如果你决定去一个成员,请记住,一旦它出现故障,所有的呼叫后会失败。至于是否值得,我建议基准。

3

创建客户端通常不是一个非常昂贵的操作 - 所以当你需要时,你应该很好地实例化它(就像Steven也提到的那样 - 如果由于错误而出现故障,你仍然需要这样做) 。

如果您使用ChannelFactory创建频道(这是实现频道的一种方法),另一方面创建ChannelFactory是相当重量级和时间密集型的操作,所以这将是一个好主意尽可能长时间挂在ChannelFactory实例上。

马克

+0

这仍然适用于.NET 4.5:http://msdn.microsoft.com/en-us/library/hh314046(v=vs.110).aspx – 2013-12-02 11:46:13

2

在过去,我已经创建了的ChannelFactory <的新实例>和客户端/代理每次调用WCF服务。我没有遇到任何问题,特别是对于演出。我编写的应用程序部署在内部公司网络(本地LAN)上,其中大约30个Windows Forms客户端将连接到我的WCF服务。

看看下面的问题Where to trap failed connection on WCF calling class?和我的答案。它基本上是一个处理客户端/代理实例化的包装类,并且执行了很多必要的错误处理以克服WCF设计中的某些缺陷(链接问题中有更多信息)。

您可以重写它或在另一个工厂进一步包装它,这样如果您担心性能,可以缓存ChannelFactory和客户端/代理。我“听说”缓存ChannelFactory或客户端/代理是一个糟糕的主意 - 但是,我愿意在这里进行更正。