ASP.NET WebApi中的Fire-forget和单向调用

Arm*_*ian 5 c# asynchronous task-parallel-library async-ctp asp.net-web-api

我完全理解HTTP世界不是单向调用的最佳选择,WebApi最适合HTTP冗长通信.毫无疑问,WCF是这里的赢家.但是,如果你已经有一个暴露了一堆动词的ApiController,在某些时候你也需要一个单向调用呢?并且您不希望为此托管/维护其他服务(WCF).

Task<HttpResponseMessage> response = client.PostAsJsonAsync<Log>("api/log", log)
Run Code Online (Sandbox Code Playgroud)

如果你没有处理响应,那么你就会得到类似于点火的东西.这是WebApi中的唯一方法还是另一种解决方案?

Dar*_*ler 6

为什么不这样调用并忽略返回的任务?

client.PostAsJsonAsync<Log>("api/log", log);
Run Code Online (Sandbox Code Playgroud)

我使用所有调用执行此操作,并在响应管道中使用处理程序以在必要时处理响应.


Ali*_*tad 5

您最好的选择是启动一个新任务并立即发送响应,而不是返回任务:

public void PostDoFireAndForget() // and NOT public Task PostDoFireAndForget()
    {
        Task.Factory.StartNew
            (() =>
                {
                    // ... start the operation here
                    // make sure you have an exception handler!!
                }

            );

    }
Run Code Online (Sandbox Code Playgroud)

  • 我看到的唯一问题是,如果调用方法在执行实际远程调用之前结束,则调用可能永远不会发生,因为线程与主线程一起被终止.采用此解决方案时应考虑到这一点. (3认同)
  • 我不明白为什么你需要开始一个新的线程. (2认同)