拥有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时会发生什么,以及如何让一个客户端实例影响服务(如果有的话)。
答案 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)
之前或之后添加代码来更改所有服务调用的开启/关闭/重用策略,添加日志记录等。