【问题标题】:WCF client - when should the client close the channelWCF 客户端 - 客户端何时应关闭通道
【发布时间】:2023-03-31 17:08:02
【问题描述】:

在典型的客户端服务应用程序中,服务是 WCF,如何使用服务引用?

例如,您是为每个调用单独实例化服务,还是打开一个并在客户端应用程序的整个生命周期中保留它? (当我提到“实例化服务”时,我的意思是实例化由 svcutil 创建的服务对象)

现在我们在客户端使用一个服务实例,因为这似乎比每次调用都创建、打开和关闭服务要快,但现在我徘徊是否可以?这种方法的主要问题是发生超时(或者我们必须打开会话 10 小时)、连接中断等,我们总是必须通过通道执行“IsAlive”以确保一切正常......

如果有任何相关性,则该应用程序是单线程的,并且身份验证是自定义构建的(通过将身份验证令牌插入到标头中)。绑定是 basicHttp(或 ws,在这种情况下并不重要)。

【问题讨论】:

    标签: c#-4.0 wcf client-server channel


    【解决方案1】:

    我个人更喜欢保持通道打开直到方法调用返回,然后关闭它以释放资源。这是最干净的方法。每次初始化代理实例只需要几毫秒,从不影响我的性能目标。

    拥有某种 ServiceClient 单例是一个有趣的想法,但正如您所说,它会带来很多副作用,所以我不确定这是一个聪明的方法,但由于您的应用程序是单线程的,所以它不应该是一个大问题,您可能会获得一些轻微的性能优势。

    如果节省毫秒是关键任务,那么您还可以拥有一个可以从中获取实例的 ServiceClient 池。

    但是,第一种方法是最干净的。复杂性不好。

    【讨论】:

    • 您如何处理安全问题?我们在打开通道之前进行身份验证...或者您是否认为网络内部的服务调用是安全的而不进行身份验证?
    • 正如 veljkoz 所说,如果您有安全通道,那么每个客户端代理初始化都非常繁重。调用多个方法会影响性能。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-22
    • 1970-01-01
    • 1970-01-01
    • 2014-11-21
    相关资源
    最近更新 更多