2

拥有 WCF 服务和消费者我不太确定如何处理 Open 和 Close 方法以及客户端的生命周期。

我自己创建了客户端,扩展和实现了 ClientBase 和 IMyService。我们称之为 MyServiceClient

例如,我使用它的一个地方是 MembershipProvider。所以我给 MembershipProvider 一个 MyClient 作为成员变量。

我想让它在 MembershipProvider 中实例化一次(通过 IoC 容器),然后可能在客户端的每个方法调用中进行 Open 和 Close 调用。

    public bool ValidateUser(string username, string password)
    {
        this.Open();
        bool b = Channel.ValidateUser(username, password);
        this.Close();
        return b;
    }

这是正确的方法吗。我真的不明白调用打开/关闭时真正发生了什么以及拥有一个客户端实例如何影响服务(如果有的话)。

4

1 回答 1

4

使用单个客户端(WCF 代理)实例的问题之一是,当发生故障时,代理会进入故障状态,并且无法重用或 Dispose-d,只能 Abort-ed 并重新创建。另一方面,如果您在服务端使用/需要会话,则需要跨多个调用使用相同的代理实例。

在任何情况下,如果您现在想使用代理并且以后担心传输、会话或故障,我建议使用这样的包装器,用于我的 WCF 代理:

TResult ExecuteServiceMethod<TResult>(Func<MyService, TResult> method)
{
    var proxy = new MyService(); //...Or reuse an existing if not faulted
    try
    {        
        return method(proxy);
    }
    catch(Exception e)
    {
        //...Handle exceptions
    }
    finally
    {
        //...Per-call cleanup, for example proxy.Abort() if faulted...
    }
}

你调用你的服务方法是这样的:

var result = ExecuteServiceMethod((MyService s) => s.VerifyUser(username, password));

替换MyService为您的实际客户类型。这样,您以后可以通过在 line 之前或之后添加代码来更改您的打开/关闭/重用策略,为所有服务调用添加日志记录等return method(client)

于 2011-10-04T12:23:07.540 回答