相关疑难解决方法(0)

从asp.net core 2中的控制器操作运行后台任务

我正在使用带有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)

.net c# asp.net-core-mvc asp.net-core asp.net-core-2.0

22
推荐指数
3
解决办法
1万
查看次数

注入DbContext时无法访问ASP.NET Core中的已处置对象

在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 …

entity-framework-core asp.net-core

20
推荐指数
4
解决办法
4万
查看次数