使用静态/集中式类关闭WCF连接

3

我希望在我的代码中实现更好的关闭WCF连接的解决方案,并处理该过程中出现的任何异常问题。我计划实施 这里 所述的解决方案,但我不想在我的类中重复此操作,而是想编写一个静态类,将我打开的连接发送到该类中进行关闭和异常处理,如下所示:

public static class WCFManager
{
    public static void CloseConnection(ServiceClient serviceClient)
    {
        try
        {
            serviceClient.Close();
        }
        catch (CommunicationException e)
        {
            var error = e.Message;
            serviceClient.Abort();
            //TODO: Log error for communication exception
        }
        catch (TimeoutException e)
        {
            var error = e.Message;
            serviceClient.Abort();
            //TODO: Log error for timeout exception
        }
        catch (Exception e)
        {
            var error = e.Message;
            serviceClient.Abort();
            //TODO: Log error for exception
        }
    }
}

我遇到的问题是,我有许多服务客户端类型,但我不确定应该针对哪个基类使用WCFManager.CloseConnection()方法。每个服务客户端似乎都是一个独特的类,我找不到适合的接口或基类。例如:

//Inside Class1:
var alphaServiceClient = new AlphaService.AlphaServiceClient();
alphaServiceClient.Open();
WCFManager.CloseConnection(alphaServiceClient); //<-- Requires AlphaServiceClient type

//Inside Class2:
var betaServiceClient = new BetaService.BetaServiceClient();
betaServiceClient.Open();
WCFManager.CloseConnection(betaServiceClient); //<-- Requires BetaServiceClient type

问题:

1: 我想避免为每个服务客户端类型创建WCFManager.CloseConnection()的覆盖,但这是我唯一的选择吗?

2: 这是一个好的选择吗?还是将连接传递会导致更多的潜在问题?

3. 既然我正在跨2-4个服务器负载平衡我的WCF服务器,每次使用时关闭连接是最好的选择,还是创建对每个ServiceClient的静态引用是更好的方案(我很确定不是,但很想听听其他人的意见!)

提示: 我正在使用NetTcpBinding,并在解决方案资源管理器中添加ServiceReferences。

谢谢!

1个回答

2
“我想避免为每个服务客户端类型创建WCFManager.CloseConnection()的覆盖,但这是我唯一的选择吗?”
所有WCF代理都继承自ICommunicationObject。实际上,这个接口定义了Abort()和Close()方法。为了调用您的方法,请始终首先将其转换为ICommunicationObject
另外一个小建议:您正在做的事情更适合作为ICommunicationObject的扩展方法。然后它变成了:
((ICommunicationObject)alphaServiceClient).CloseConnection();

2:这是一个好的选择吗?传递连接会导致更多的潜在问题吗?
这是一个帮助方法,几乎不涉及“传递连接”。没问题。
3:由于我正在将我的WCF服务器负载均衡到2-4台服务器上,每次使用时关闭连接是最好的选择吗?
是的。使用连接并关闭它。

谢谢,这正是我所期望的答案类型! - INNVTV

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接