【问题标题】:Do I need to close the connection to a WCF service from a console that exits straight away?我是否需要从立即退出的控制台关闭与 WCF 服务的连接?
【发布时间】:2017-12-14 13:08:27
【问题描述】:

我有一个控制台应用程序,我想对 WCF 服务进行“即发即弃”调用,然后关闭而不等待响应。它只是应该启动清理工作。这项工作可能需要几个小时才能完成,所以我不希望控制台应用保持打开状态并等待它。

我已在合同中的方法中添加了“IsOneWay=true”,但控制台应用仍等待任务完成,然后再执行 client.close() 并退出。

如果我删除了 client.Close(),那么控制台应用程序将按照我想要的方式运行,但我不确定即使控制台应用程序不再运行,通道是否会保持打开状态?

这是我的控制台应用程序代码:

static void Main(string[] args)
{
    Console.WriteLine("Starting Cleanup");

    var client = new IntegrationWcfServiceClient(EndPointConfigurationName);

    try
    {
        client.ExecuteCleanup();
        //client.Close();
    }
    catch (Exception ex)
    {
        client.Abort();
        WriteLineRed($"Couldn't start cleanup: {ex.Message}");
        return;
    }

    WriteLineGreen("Cleanup started successfully");
}

这里是操作合约代码:

[OperationContract(IsOneWay = true)]
void ExecuteCleanup();

【问题讨论】:

  • 最好对 WCF 方法进行编码以返回指示清理已启动的消息,然后在另一个线程中执行所述清理。这样一来,您不仅会在清理执行过程中中断连接,而且不会那么麻烦。
  • 进程终止后通道不会保持打开状态,所以应该没问题。
  • @Justin 谢谢,这似乎也很有效。

标签: c# wcf console-application fire-and-forget isoneway


【解决方案1】:

在进行单向呼叫时,您需要考虑的事项很少。 摘自《Programming WCF services》一书。

  1. 理想情况下,当客户端调用单向方法时,它应该只被阻塞 发送呼叫所需的最短时间。然而,实际上,单向调用并不等同于异步调用。当单向调用到达服务时,它们可能不会 一次分派,但可能会在服务端缓冲以进行分派 一次一个,根据服务配置的并发模式行为
  2. 虽然单向操作不会从服务本身返回值或异常, 将它们视为单行道或“黑洞”是错误的 可以出来。客户端仍然应该期待单向调用的异常,并且可以 甚至推断服务上的调用失败。在调度单向操作时, 由于通信问题(例如错误的地址或主机)而导致的任何错误 不可用)将在客户端尝试调用 操作。

如果我删除了 client.Close(),那么控制台应用程序将按照我想要的方式运行,但我不确定即使控制台应用程序不再运行,通道是否会保持打开状态?

单向调用本质上不是一劳永逸的,因为客户端可以发现 在单向调用期间服务出现问题。

在这里您试图异步调用单向操作,因此您无法关闭连接或代理。

[OperationContract(IsOneWay = true,AsyncPattern = true)]
IAsyncResult ExecuteCleanup(AsyncCallback callback,object asyncState);

client.ExecuteCleanup(,null,null);

注意:如果您不想使事情复杂化,请确保 ExecuteCleanup 是您服务中的最后一次调用,稍后您可以关闭,这不会影响以后的操作。 可能的实现How to properly close a client proxy (An existing connection was forcibly closed by the remote host)?

【讨论】:

    猜你喜欢
    • 2011-01-21
    • 1970-01-01
    • 2011-02-07
    • 2021-06-30
    • 2015-08-08
    • 1970-01-01
    • 2019-05-24
    • 2011-08-08
    • 2013-03-04
    相关资源
    最近更新 更多