WCF服务和围绕客户端和开放/关闭方法的最佳实践

时间:2011-10-04 11:03:54

标签: wcf wcf-client lifetime

拥有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;
    }

这是正确的方法吗?我真的不明白在调用open / close时会发生什么,以及如何让一个客户端实例影响服务(如果有的话)。

1 个答案:

答案 0 :(得分:4)

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

在任何情况下,如果您想立即使用代理并担心传输,会话或故障,我建议使用这样的包装器,用于我的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替换为您的实际客户端类型。这样,您可以稍后通过在行return method(client)之前或之后添加代码来更改所有服务调用的开启/关闭/重用策略,添加日志记录等。