首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >WCF服务和有关客户端和打开/关闭方法的最佳实践

WCF服务和有关客户端和打开/关闭方法的最佳实践
EN

Stack Overflow用户
提问于 2011-10-04 19:03:54
回答 1查看 1.7K关注 0票数 2

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

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

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

我希望它在MembershipProvider中实例化一次(通过IoC容器),然后可能在客户端的每个方法调用中执行一次打开和关闭调用。

代码语言:javascript
复制
    public bool ValidateUser(string username, string password)
    {
        this.Open();
        bool b = Channel.ValidateUser(username, password);
        this.Close();
        return b;
    }

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-10-04 20:23:08

使用单个客户端(WCF代理)实例的问题之一是,当发生故障时,代理进入故障状态,并且它不能被重用或处置,只能中止并重新创建。另一方面,如果您在服务端使用/请求Sessions,则需要在多个调用中使用相同的代理实例。

在任何情况下,如果你想现在使用代理,以后再担心传输、会话或错误,我建议我为我的WCF代理使用一个这样的包装器:

代码语言:javascript
复制
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...
    }
}

你可以像这样调用你的服务方法:

代码语言:javascript
复制
var result = ExecuteServiceMethod((MyService s) => s.VerifyUser(username, password));

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

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7646897

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档