【问题标题】:WCF Proxy usageWCF 代理使用情况
【发布时间】:2011-10-19 20:35:24
【问题描述】:

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();
            }
        }
    } 
}

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

【问题讨论】:

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


    【解决方案1】:

    这实际上还不错。也许您可以改为使用ICommunicationObject,因为您的主机也需要相同的代码。

    考虑它的方式是友好的调用。请结束我的通话并将代理返回连接池。中止是“我不在乎,关闭代理,因为它已经死了,并且因为它已经死了,所以也将它从池中删除”。

    根据您的代码,如果可能,您可能希望从函数调用部分抽象出代码的“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();
    }
    

    【讨论】:

      猜你喜欢
      • 2010-11-14
      • 1970-01-01
      • 1970-01-01
      • 2019-03-09
      • 1970-01-01
      • 1970-01-01
      • 2014-06-19
      • 2012-01-20
      • 2011-07-08
      相关资源
      最近更新 更多