WCF客户端实例化

时间:2009-07-30 16:25:54

标签: asp.net-mvc wcf web-services

我有一个使用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();
    }
}

3 个答案:

答案 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)

如果您决定与会员一起去,请记住,一旦出现故障,之后的所有通话都将失败。至于是否值得,我建议进行基准测试。