有了WCF服务和消费者,我不太确定如何处理Open和Close方法以及我的客户端的生命周期。
我自己创建了客户端,扩展并实现了ClientBase和IMyService。让我们称它为MyServiceClient
例如,我使用它的一个地方是MembershipProvider。所以我给了MembershipProvider一个MyClient作为成员变量。
我希望它在MembershipProvider中实例化一次(通过IoC容器),然后可能在客户端的每个方法调用中执行一次打开和关闭调用。
public bool ValidateUser(string username, string password)
{
this.Open();
bool b = Channel.ValidateUser(username, password);
this.Close();
return b;
}这是正确的方法吗?我真的不明白调用open/close时到底发生了什么,以及拥有一个客户端实例对服务有什么影响(如果有的话)。
发布于 2011-10-04 20:23:08
使用单个客户端(WCF代理)实例的问题之一是,当发生故障时,代理进入故障状态,并且它不能被重用或处置,只能中止并重新创建。另一方面,如果您在服务端使用/请求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)行之前或之后添加代码来更改您的打开/关闭/重用策略,为所有服务调用添加日志记录等。
https://stackoverflow.com/questions/7646897
复制相似问题