我使用WCF服务异步。如果我无法连接到服务或发生异常,则会进入故障状态,并将错误写入Error
的{{1}}属性。
我该如何处理服务客户端?我无法关闭它,因为它会抛出AsyncCompletedEventArgs
。记录错误后我还需要做些什么?
这是我的代码:
CommunicationObjectFaultedException
答案 0 :(得分:4)
您可以中止它,并创建一个新的。这是我编写的一个处理该问题的类的片段。当客户处于故障状态时,它触及的所有内容都是合法的。
if (_client.InnerChannel.State == CommunicationState.Faulted)
{
_client.Abort();
_client = new TServiceClient();
}
TServiceClient
是System.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)
你可以用它做的不多。创建一个新的,让垃圾收集器收集另一个。