Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-core/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# ASP.NET Core返回HTTP响应并继续使用相同上下文的后台工作程序_C#_Asp.net Core_Dependency Injection_Active Directory_Backgroundworker - Fatal编程技术网

C# ASP.NET Core返回HTTP响应并继续使用相同上下文的后台工作程序

C# ASP.NET Core返回HTTP响应并继续使用相同上下文的后台工作程序,c#,asp.net-core,dependency-injection,active-directory,backgroundworker,C#,Asp.net Core,Dependency Injection,Active Directory,Backgroundworker,抱歉,这是一个有点冗长的设置/问题。我目前正在使用C#ASP.NET Core 2.1开发一个API。我有一个POST端点,执行它大约需要5-10秒(这很好)。我需要添加可能需要相当长时间才能执行的功能。我当前的负载测试需要额外的3分钟。老实说,生产可能需要更长的时间,因为我不能真正得到一个好的答案,我们可以期待有多少这样的事情要处理。从用户体验的角度来看,如果前端在等待现有POST请求的结果,那么等待这么长时间是不可接受的。为了保持可接受的用户体验 使用默认的ASP.NET核心DI容器将所有服

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

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

我首先尝试只创建一个后台工作程序,但在将响应发送到客户端之后,内部对象将开始被释放(即实体db上下文),并且当继续尝试使用所述上下文执行代码时,它最终会抛出错误(这是有意义的,因为它们正在被释放)

通过使用注入的IServiceScopeFactory(默认ASP.NET核心实现),我可以让一个后台工作人员大部分时间都在工作。在我尝试保存到数据库之前,我的所有代码都会成功执行。我们已经重写了SaveChangesAsync()方法,以便它将分别自动将属性CreatedByName、CreatedTimestamp、UpdatedByName和UpdatedTimestamp更新为当前跟踪的实体。由于此逻辑由从IServiceScopeFactory创建的对象使用,因此它似乎不共享相同的HttpContext,因此无法正确更新CreatedByName和UpdatedByName(尝试将它们设置为null,但DB列不接受null)

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

很抱歉,我目前没有工作,目前无法提供代码示例,但是如果为了完全回答这篇文章而需要,我将在稍后发布一些代码示例

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

在后台任务中查看非常易于使用的库