WCF代理使用情况

时间:2011-10-19 20:35:24

标签: c# .net wcf proxy using-statement

发布了{p> This answer以回复this question

现在它有点高于我的头,但是应该在客户端代理类中使用的“高阶函数”?这是正确的用法吗?:

public class MyProxy
{
    readonly IMyService service =
        new ChannelFactory<IMyService>("IMyService").CreateChannel();

    public ResponseObject Foo(RequestObject request)
    {
        return UseService((IMyService service) =>
            service.Bar(request));
    }

    T UseService<T>(Func<IIssueTrackerService, T> code)
    {
        bool error = true;

        try
        {
            T result = code(issueTrackerChannel);
            ((IClientChannel)issueTrackerChannel).Close();
            error = false;
            return result;
        }
        finally
        {
            if (error)
            {
                ((IClientChannel)issueTrackerChannel).Abort();
            }
        }
    } 
}

我真正想要的只是一些指导,以及正确的方法。

1 个答案:

答案 0 :(得分:1)

这实际上并不坏。也许您可以转换为ICommunicationObject,因为您的主机也需要相同的代码。

考虑它的方式很接近是友好的电话。请完成我的呼叫并将代理返回到连接池。 Abort是“我不在乎,关闭代理,因为它已经死了,也将它从池中删除,因为它已经死了”。

根据您的代码,如果可能,您可能希望从函数调用部件中抽象代码的“WCF代理”部分。这样,您就可以单独测试应用程序逻辑与WCF代理程序代码。

您可能希望查看try {} catch(CommunicationException),以便您可以将WCF异常分别处理为应用程序级异常,而不是finally。

try 
{
    try 
    {
        proxy.call();
        //app logic

        ((ICommunicationObject)proxy).Close();
    } 
    catch (SomeAppException)
    {
    //recover app exception
    }
}
catch (CommunicationException) 
{
    ((ICommunicationObject)proxy).Abort();
}