C# 处理通过接口实例化的WCF客户端
我想澄清以下内容(如果这是一个愚蠢的问题,请提前道歉) 我正在处理一些调用WCF服务的现有代码 此代码通过接口实例化WCF服务客户端,并执行其需要的操作,即:C# 处理通过接口实例化的WCF客户端,c#,web-services,wcf,C#,Web Services,Wcf,我想澄清以下内容(如果这是一个愚蠢的问题,请提前道歉) 我正在处理一些调用WCF服务的现有代码 此代码通过接口实例化WCF服务客户端,并执行其需要的操作,即: IWCFService proxyClient = new WCFServiceClient() 然而,我在这里试图做的是确保连接正常关闭,即:proxyClient.Close()等,但我无法访问这些,因为它是通过一个接口创建的(该接口仅包含操作,即:DoSomething()) 如果我实例化为WCF服务客户机(而不是通过接口),我将
IWCFService proxyClient = new WCFServiceClient()
然而,我在这里试图做的是确保连接正常关闭,即:proxyClient.Close()
等,但我无法访问这些,因为它是通过一个接口创建的(该接口仅包含操作,即:DoSomething()
)
如果我实例化为WCF服务客户机(而不是通过接口),我将能够访问Close()&Abort调用,我可以在try{}catch{}块中使用这些调用。
i、 e:
这是添加Close()和Abort()的简单情况吗我最近写了一篇关于正确处理WCF客户机生命周期的文章:仅使用
块将实例化包装在中是不够的
看看
摘要:重载Dispose
使用关键字使用客户端的以下方法:
public void Dispose()
{
if (isDisposed)
return;
try
{
if (service.State == CommunicationState.Faulted)
service.Abort();
else
{
try
{
service.Close();
}
catch (Exception closeException)
{
try
{
service.Abort();
}
catch (Exception abortException)
{
throw new AggregateException(closeException, abortException);
}
throw;
}
}
}
finally
{
isDisposed = true;
}
}
Dispose呼叫在内部关闭。只需使用
block@PanagiotisKanavos只有在通信失败的情况下,才能调用Close
抛出异常,并且必须使用Abort
。使用using()语句不是WCF客户端的良好做法,因为它们可以在Close()操作中返回异常,这是真的,在注意到OP试图优雅地关闭之前,我发表了评论。虽然这在理论上可以回答问题,但在这里包括答案的基本部分,并提供链接供参考。我理解上述逻辑-但是服务客户端是通过接口实例化的(由一个团队编写,该团队公开了一些业务操作),并且没有访问.Close()和.Abort()函数的权限。是否最好以正常方式实例化它,以便我可以访问这些方法?例如:WCFClientProxy clientProxy=new WCFClientProxy()。您需要检查Dispose
是否正确实现(仅调用Close
是不够的);如何实例化代理objectright取决于您-我可以看到Dispose是在WCF服务本身上实现的(将一些对象设置为NULL),我的理解是对的,在服务器端,WCF在处理请求时会自动调用它吗?客户端和服务器端实现是两件不同的事情,您需要检查双方是否正确实现(提到的问题仅适用于客户端)
public void Dispose()
{
if (isDisposed)
return;
try
{
if (service.State == CommunicationState.Faulted)
service.Abort();
else
{
try
{
service.Close();
}
catch (Exception closeException)
{
try
{
service.Abort();
}
catch (Exception abortException)
{
throw new AggregateException(closeException, abortException);
}
throw;
}
}
}
finally
{
isDisposed = true;
}
}