我正在使用带有asp.net core 2.0的C#开发一个带有REST Api的Web应用程序
我想要实现的是当客户端向端点发送请求时,我将运行与客户端请求上下文分离的后台任务,如果任务成功启动,该任务将结束.
我知道有HostedService,但问题是HostedService在服务器启动时启动,据我所知,没有办法从控制器手动启动HostedService.
这是一个简单的代码来演示这个问题.
[Authorize(AuthenticationSchemes = "UsersScheme")]
public class UsersController : Controller
{
[HttpPost]
public async Task<JsonResult> StartJob([FromForm] string UserId, [FromServices] IBackgroundJobService backgroundService) {
//check user account
(bool isStarted, string data) result = backgroundService.Start();
return JsonResult(result);
}
}
Run Code Online (Sandbox Code Playgroud) 在ASP.NET Core项目中,我在Startup上有以下内容:
services.AddDbContext<Context>(x => x.UseSqlServer(connectionString));
services.AddTransient<IValidationService, ValidationService>();
services.AddTransient<IValidator<Model>, ModelValidator>();
Run Code Online (Sandbox Code Playgroud)
ValidationService如下:
public interface IValidationService {
Task<List<Error>> ValidateAsync<T>(T model);
}
public class ValidationService : IValidationService {
private readonly IServiceProvider _provider;
public ValidationService(IServiceProvider provider) {
_provider = provider;
}
public async Task<List<Error>> ValidateAsync<T>(T model) {
IValidator<T> validator = _provider.GetRequiredService<IValidator<T>>();
return await validator.ValidateAsync(model);
}
}
Run Code Online (Sandbox Code Playgroud)
ModelValidator如下:
public class ModelValidator : AbstractValidator<Model> {
public ModelValidator(Context context) {
// Some code using context
}
}
Run Code Online (Sandbox Code Playgroud)
当我在控制器中注入IValidationService并将其用作:
List<Error> errors = await _validator.ValidateAsync(order);
Run Code Online (Sandbox Code Playgroud)
我收到错误:
System.ObjectDisposedException:无法访问已处置的对象.此错误的常见原因是处理从依赖项注入解析的上下文,然后尝试在应用程序的其他位置使用相同的上下文实例.如果您在上下文中调用Dispose()或将上下文包装在using语句中,则可能会发生这种情况.如果使用依赖项注入,则应该让依赖项注入容器负责处理上下文实例.对象名称:'上下文'.
知道为什么我在ModelValidator中使用Context时遇到此错误.
如何解决这个问题?
UPDATE …