【问题标题】:Cannot call method on WCF service from other WCF service ASync but can Sync无法从其他 WCF 服务异步调用 WCF 服务上的方法,但可以同步
【发布时间】:2015-05-22 04:21:28
【问题描述】:

我们有一个包装在 Windows 服务中的 WCF 记录器,它公开了各种方法,我可以从一个简单的控制台测试应用程序成功地同步和异步调用这些方法。在调试模式下从工作室运行服务,我可以看到各种断点被命中,我们得到了预期的输出。

当我从另一个 WCF 服务同步调用相同的服务方法时,这些方法也都可以正常工作......

using (var logger = new LoggerServiceClient())
    logger.Log(...);

但是,如果我更改为 Async 调用方法,它根本不会执行任何操作...

using (var logger = new LoggerServiceClient())
    logger.LogAsync(...);

我没有收到任何错误,代码愉快地继续运行,但没有任何内容影响记录器服务。不能是权限,因为同步方法调用有效。

就像我说的,相同的代码和配置位于测试控制台应用程序中,并且运行良好。我可以简单地在调用服务中添加或删除“异步”后缀,但行为不同。我们正在使用 w7,framework 4.0,使用 tpl,而 4.5 目前不是一个选项。

这让我很困惑,所以任何想法,无论多么奇怪,都会被考虑。

【问题讨论】:

  • 您是否尝试等待异步调用? await logger.LogAsync(...),省略 await 关键字可能会导致意外行为。
  • 就像我提到的,这是使用 4.0 - 据我了解,Async/Await 仅在 C# 5.0 和 .NET Framework 4.5 中引入
  • 是与否,await 关键字是一个编译器功能,它 can be used on framework 4 使用 vs2012 甚至 vs2010。无论如何,如果您的应用程序没有准备好异步,您不应该使用异步调用。

标签: c# web-services wcf asynchronous .net-4.0


【解决方案1】:

logger.LogAsync() 方法将立即返回。 当您使用带有 using 语句的 logger 时,logger 对象也将立即被释放。这可能是记录器服务没有命中的原因。

尝试删除 using 语句:

var logger = new LoggerServiceClient();
logger.LogAsync(...);

更新

我刚找到一篇文章Do not use “using” in WCF Client。有以同步模式关闭 WCF 客户端的示例。

对于异步客户端调用,您可以在任务的继续中关闭 WCF 客户端:

logger.LogAsync(...).ContinueWith(x => {
    // check task
    if (x.IsFaulted)
    {
        // you need to touch x.Exception property here
        // or your application will crash because of unhandled exception
        Console.WriteLine("LogAsync error occured: {0}", x.Exception);
    }
    try
    {
        logger.Close();
    }
    catch (CommunicationException e)
    {
        logger.Abort();
    }
    catch (TimeoutException e)
    {
        logger.Abort();
    }
    catch (Exception e)
    {
        // you will want to log this exception to log file
        Console.WriteLine("LogAsync client close error: {0}", e);
        logger.Abort();
        // no throw here or your application will crash
    }
});

延续 lambda 主体很长,您可能希望重用它。所以,写一个延续的扩展方法是值得的。

希望这会有所帮助。

【讨论】:

  • 使用理论是有道理的,我会在周末试一试(代码有点移动,所以我必须重新创建)。我会让你知道我是怎么过的。干杯
猜你喜欢
  • 2011-05-04
  • 1970-01-01
  • 2014-04-30
  • 1970-01-01
  • 2014-07-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多