如何处理故障状态的WCF服务客户端?

时间:2015-02-12 15:09:16

标签: c# wcf asynchronous

我使用WCF服务异步。如果我无法连接到服务或发生异常,则会进入故障状态,并将错误写入Error的{​​{1}}属性。

我该如何处理服务客户端?我无法关闭它,因为它会抛出AsyncCompletedEventArgs。记录错误后我还需要做些什么?

这是我的代码:

CommunicationObjectFaultedException

2 个答案:

答案 0 :(得分:4)

您可以中止它,并创建一个新的。这是我编写的一个处理该问题的类的片段。当客户处于故障状态时,它触及的所有内容都是合法的。

if (_client.InnerChannel.State == CommunicationState.Faulted)
{
    _client.Abort();
    _client = new TServiceClient();
}

TServiceClientSystem.ServiceModel.ClientBase<TIClientInterface>的任何子类。

我写道,因为我从MVC4网络应用程序的服务器端调用webservices时经常出现访问问题,浏览器客户端通过RDS访问页面。

但是,截至目前,上述代码尚未使用。由于我不理解的原因,它有更多的访问拒绝异常,而不是最简单的方法,总是创建一个每次通话的新客户,并在之后处理。我从不打扰检查故障状态因为我从不使用它们进行多次通话。

using (var cli = new Blah.Blah.FooWCFClient())
{
    _stuff = cli.GetStuff();
}

...当然是在尝试/捕获中。如果您发现客户端缓存/中止方法有任何问题,我建议您尝试为每个呼叫创建一个新客户端。也许它花费了几个周期,但是调用Web服务并且然后开始担心运行时效率是愚蠢的。那匹马离开了谷仓。

我不知道这将如何与异步业务进行交互,除了一个模糊的直觉,即保持简单并且不跨线程共享任何东西。

欢迎来到我的噩梦。我还没有确定我们访问问题的原因,但我怀疑事情可能对您不利。所以我希望这两个选项中至少有一个可以解决。

更新

这是我们的XAML应用程序中的一些.tt生成的服务包装器代码。每个Web服务调用方法都像这样包装,并且多年来一直是防弹的。我建议基本上这样做:

public static POCO.Thing GetThing(int thingID)
{
    var proxy = ServiceFactory.CreateNewFooWCFClientInstance();
    try
    {
        var returnValue = proxy.GetThing(thingID);
        proxy.Close();
        return returnValue;
    }
    catch(Exception ex)
    {
        //  ***********************************
        //  Error logging boilerplate redacted
        //  ***********************************
        proxy.Abort();
        throw;
    }
}

我觉得如果你根本不重用WCF客户端对象也是如此。

答案 1 :(得分:1)

你可以用它做的不多。创建一个新的,让垃圾收集器收集另一个。