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

Posted

技术标签:

【中文标题】ASP.NET WebApi 中的 Fire-forget 和单向调用【英文标题】:Fire-forget and One-Way Calls in ASP.NET WebApi 【发布时间】:2012-12-05 22:06:24 【问题描述】:

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

Task<HttpResponseMessage> response = client.PostAsJsonAsync<Log>("api/log", log)

如果您不处理响应,那么您会遇到类似于即发即弃的情况。这是 WebApi 中的唯一方法还是有其他解决方案?

【问题讨论】:

我希望您能分享结果并选择或添加答案。这对其他人会有所帮助。 【参考方案1】:

为什么不直接这样调用而忽略返回的任务呢?

client.PostAsJsonAsync<Log>("api/log", log);

我对所有调用都执行此操作,并在必要时使用响应管道中的处理程序来处理响应。

【讨论】:

由于未观察到的任务异常,此代码具有潜在危险。 在即发即弃的环境中,仅应在客户端处理通信异常。如果发生通信问题,调用线程无论如何都会失败并抛出异常。剩下的就是服务本身的头疼了,所以未观察到的任务异常在这里应该不会很危险。 @Darrel 您是否将 WebApi 动词定义为 void 或 Task 用于单向调用?对于这个特定问题,我认为 void 应该是首选,因为您并不暗示 O/W 操作有任何等待/等待能力。【参考方案2】:

最好的办法是开始一个新任务并立即发送响应而不是返回任务:

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

            );

    

【讨论】:

我看到的唯一问题是,如果调用方法在实际远程调用执行之前结束,则调用可能永远不会发生,因为线程与主线程一起被杀死。在采用此解决方案时,您应该考虑到这一点。 嗯,这就是请求-响应协议的固有问题。但是机会真的很渺茫 @DarrelMiller 因为返回任务意味着在任务完成之前不会返回响应,这与 OP 想要的不同。 @Aliostad 对 XXXAsync 的任何调用都应该很快返回。 OP 想做 FireAndForget 我解释的意思是,他不关心回应。 @DarrelMiller 如果您没有返回任务,那很好。但是您的代码很危险,因为您没有观察任务异常。

以上是关于ASP.NET WebApi 中的 Fire-forget 和单向调用的主要内容,如果未能解决你的问题,请参考以下文章

ASP.NET Core 5.0 WebAPI 中的多种身份验证方案

ASP.NET WebAPI 中的 HttpServiceHost 等价物是啥?

模型绑定不适用于 ASP.NET Core 2 WebAPI 中的 POST 请求

ASP.NET WebAPI 中的路由冲突

ASP.Net WebAPI 返回列表中的空对象

需要一些帮助来构建 asp.net 核心 webapi 中的 [HttpPost] 部分