2016-10-12 14 views
0

你好,的操作已经在进行中的错误,同时从中间件

访问DB我在PostgreSQL数据库服务器上运行EF核心的ASP.NET核心应用。我遇到了这个问题:

当我从控制器访问数据库时,一切工作正常。 但是,当我尝试从中间件访问DB,(二者更高的要求负荷下)发生异常:

System.InvalidOperationException: An operation is already in progress. 
    at Npgsql.NpgsqlConnector.StartUserAction(ConnectorState newState) 
    at Npgsql.NpgsqlCommand.<ExecuteDbDataReaderInternalAsync>d__4.MoveNext() 
... 

样品的编号:


DB配置

private void ConfigureDatabase(IServiceCollection services) 
{ 
    var connectionString = ConfigObject.Value.DbContextSettings.ConnectionString; 
    services.AddDbContext<ApplicationDbContext>(opts => opts.UseNpgsql(connectionString)); 
} 

的DbContext

public class ApplicationDbContext : IdentityDbContext<ApplicationUser, Role, Guid> 
    { 

     ... 

     public DbSet<SomeItem> SomeItems { get; set; } 

     ... 
    } 

中间件

public async Task Invoke(HttpContext context) 
     { 
       var test = await _context.SomeItems.FirstOrDefaultAsync(); 
     } 

的控制器

public async Task<SomeItem> GetStuff() 
     { 
       return await _context.SomeItems.FirstOrDefaultAsync(); 
     } 

我的问题是 - 为什么是控制器能够提供许多异步并发请求和中间件不是?我怎样才能得到它呢?我现在有点失去了异步性和ASP.NET解剖。

预先感谢您。

回答

1

当您在使用中间件构造函数注入,如果依赖一辈子的范围限定它会导致captive dependency。你使用了ApplicationDbContext,它的作用域是。所以这个问题很可能出于这个原因。为了避免,可以将依赖关系传递给Invoke方法作为参数:

public async Task Invoke(HttpContext context, ApplicationDbContext _context) 
    { 
     var test = await _context.SomeItems.FirstOrDefaultAsync(); 
    } 
0

我不知道为什么你会收到错误,但两种方法都不一样。中间件没有返回类型,控制器没有'SomeItem'。此外,只需立即返回Async方法,并从Task中删除asnyc等待。

公共异步任务GetStuff()
{ 返回等待_context.SomeItems.FirstOrDefaultAsync(); }

public Task<SomeItem> GetStuff() 
{ 
    return _context.SomeItems.FirstOrDefaultAsync(); 
} 
相关问题