繁体   English   中英

使用扩展方法调用WCF服务

[英]Calling WCF service using extension method

我编写了一个与WCF服务一起使用的扩展方法,它将所有处理和异常处理逻辑保存在一个地方。 方法如下:

public static TResult CallMethod<TChannel, TResult>(
    this ClientBase<TChannel> proxy,
    Func<TResult> func) where TChannel : class
{
    proxy.ThrowIfNull("proxy");
    func.ThrowIfNull("func");

    try
    {
        // set client credentials
        return func();
    }
    finally
    {
        if (proxy != null)
        {
            try
            {
                if (proxy.State != CommunicationState.Faulted)
                {
                    proxy.Close();
                }
                else
                {
                    proxy.Abort();
                }
            }
            catch (CommunicationException)
            {
                proxy.Abort();
            }
            catch (TimeoutException)
            {
                proxy.Abort();
            }
            catch (Exception)
            {
                proxy.Abort();
                throw;
            }
        }
    }
}

该方法将使用如下:

public int CreateBusinessObject(BusinessObject item)
{
    MyServiceClient proxy = new MyServiceClient();
    return proxy.CallMethod(() => proxy.CreateBusinessObject(item));
}

我的问题是,这是否会更好地作为创建服务代理的静态方法? 我有点担心我目前的实施情况。 代理的构造是否应该在try / catch中? 我目前的理解是,如果构造函数失败,无论如何都没有什么可以处理的。

如果构造函数失败,则整个对象处于无效状态。 你不应该担心在这种情况下处置。

对此执行的一个很好的测试是执行以下操作时会发生什么:

class Program
{
    static void Main(string[] args)
    {
        using (new TestClass())
        {
            Console.WriteLine("In using");
        }
    }

    class TestClass : IDisposable
    {
        public TestClass()
        {
            throw new Exception();
        }

        public void Dispose()
        {
            Console.WriteLine("Disposed");
        }
    }
}

结果是永远不会达到处置。 这是构造函数失败时发生的情况。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM