繁体   English   中英

ASP.NET核心返回HTTP响应并继续具有相同上下文的后台工作者

[英]ASP.NET Core Return HTTP Response And Continue Background Worker With Same Context

对不起,这是一个冗长的设置/问题。 我目前正在使用C#ASP.NET Core 2.1开发API。 我有一个POST端点,执行大约需要5-10秒(这很好)。 我需要添加可能需要相当长时间才能执行的功能。 我目前的负载测试需要额外的3分钟。 说实话,生产可能会花费更长的时间,因为我无法真正得到一个好的答案,我们可以期望处理多少这些事情。 从用户体验的角度来看,等待这一长时间是不可接受的,因为前端正在等待现有POST请求的结果。 为了维持可接受的用户体验。

使用默认的ASP.NET Core DI容器将所有服务设置为瞬态。 此应用程序使用EF Core并以与服务相同的方式设置(抱歉,我现在没有工作,忘记了安装文件中的确切措辞)。

我首先尝试创建一个后台工作程序,但是在将响应发送到客户端之后,内部对象将开始被处理(即实体数据库上下文),并且当继续尝试使用所述上下文执行代码时,它将最终抛出错误(因为他们被处置了所以有意义。

我能够让一个后台工作者主要使用注入的IServiceScopeFactory(默认的ASP.NET Core实现)。 我的所有代码都成功执行,直到我尝试保存到数据库。 我们重写了SaveChangesAsync()方法,以便它自动将属性CreatedByName,CreatedTimestamp,UpdatedByName和UpdatedTimestamp分别更新到当前跟踪的实体。 由于此逻辑由从IServiceScopeFactory创建的对象使用,因此它似乎不共享相同的HttpContext,因此不会正确更新CreatedByName和UpdatedByName(尝试将这些设置为null但DB列不接受null) 。

就在我离开工作之前,我创造了一些似乎有用的东西,但它看起来很脏。 我没有在后台工作程序中使用IServiceScopeFactory来创建新作用域,而是使用WebClient对象创建了一个模拟请求,该对象指向当前正在执行的同一API中的端点。 这确实允许响应以及时的方式发送回客户端,这确实继续在服务器上执行新功能(正确更新我的实体)。

我道歉,我目前没有工作,目前无法提供代码示例,但如果要完全回答这篇文章是必需的,我稍后会介绍一些。

理想情况下,我希望能够启动我的请求,处理现有POST中的逻辑,将响应发送回客户端,并使用相同的上下文(包括包含身份信息的HttpContext)继续执行新功能。 我的问题是,这可以在不创建模拟请求的情况下完成吗? 这可以通过后台工作者使用与原始线程相同的上下文来完成(我知道这听起来有点奇怪)? 他们的另一种方法是我完全失踪了吗? 提前谢谢。

查看Hangfire非常易于使用的库来执行后台任务。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM