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

问题描述 投票:0回答:1

对不起,这是一个冗长的设置/问题。我目前正在使用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)继续执行新功能。我的问题是,这可以在不创建模拟请求的情况下完成吗?这可以通过后台工作者使用与原始线程相同的上下文来完成(我知道这听起来有点奇怪)?他们的另一种方法是我完全失踪了吗?提前谢谢。

c# asp.net-core dependency-injection active-directory backgroundworker
1个回答
0
投票

查看Hangfire非常容易使用库进行后台任务。

© www.soinside.com 2019 - 2024. All rights reserved.