我有一个使用WCF服务(WSHttpBinding)的mvc控制器类,有时在一个http请求中有多个调用,并想知道为该服务创建客户端的成本是多少。可以为每次调用创建客户端实例,还是应该在类中创建成员变量?
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();
}
}
答案 0 :(得分:3)
创建客户端通常不是一个非常昂贵的操作 - 因此您应该在需要时进行实例化(如Steven所提到的那样 - 如果由于错误导致其出现故障,则无论如何都需要这样做)。
如果您使用ChannelFactory创建频道(这是其中一种方法),另一方面创建ChannelFactory是一项非常重量级且耗时的操作,因此挂起是个好主意尽可能长的到一个ChannelFactory实例。
马克
答案 1 :(得分:2)
过去,我已经创建了ChannelFactory的新实例<>和每次调用WCF服务的客户端/代理。我没有遇到任何问题,尤其是性能问题。我编写的应用程序部署在内部公司网络(本地LAN)上,大约30个Windows窗体客户端将连接到我的WCF服务。
查看以下问题Where to trap failed connection on WCF calling class?以及我对此的回答。它基本上是一个包装类,它处理客户端/代理实例化并进行大量必要的错误处理,以克服WCF设计中的某些缺点(链接问题中的更多信息)。
您可以重新编写它或将其进一步包装在另一个工厂中,以便在您担心性能时可以缓存ChannelFactory和客户端/代理。我已经“听到”缓存ChannelFactory或客户端/代理是一个坏主意 - 但是,我愿意在这里进行更正。
答案 2 :(得分:1)
如果您决定与会员一起去,请记住,一旦出现故障,之后的所有通话都将失败。至于是否值得,我建议进行基准测试。