1

我有一个控制台应用程序,我想对 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();
4

1 回答 1

1

在进行单向呼叫时,您需要考虑的事项很少。来自《编程 WCF 服务》一书。

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

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

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

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

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

client.ExecuteCleanup(,null,null);

注意:如果您不想使事情复杂化,请确保 ExecuteCleanup 是您服务中的最后一次调用,稍后您可以关闭,这不会影响以后的操作。可能的实现如何正确关闭客户端代理(现有连接被远程主机强行关闭)?

于 2017-12-14T16:32:38.113 回答