gpt4 book ai didi

c# - 有没有办法创建一个将 Action 的内容包装在 using 语句中的 ActionFilter?

转载 作者:太空狗 更新时间:2023-10-30 01:36:05 26 4
gpt4 key购买 nike

我的场景:我的应用程序是一个 Web Api 2 应用程序,使用业务逻辑和存储库层进行数据访问。 Web 应用程序使用 ASP.NET 模拟以访问网站的用户身份登录到数据库(通过 PKI 进行身份验证)。我有几个异步 Controller 方法。但是,当我在数据访问方法上await 时,数据库调用可能会在另一个线程上完成,然后该线程将以不允许连接到数据库的应用程序池的身份访问数据库。

示例 Controller :

public class TestApiController : ApiController {
private IBusinessLogicObject _myBlObject;

public TestApiController(IBusinessLogicObject myBlObject){
_myBlObject = myBlObject; //Populated through Unity
}

public async Task<int> CountMyJobs(string name){
return await _myBlObject.CountMyJobsAsync(name);
}
}

示例业务逻辑类:

public class BusinessLogicObject : IBusinessLogicObject
{
private IGenericRepository<Job> _jobRepository;

public BusinessLogicObject(IGenericRepository<Job> _jobRepository)
{
_jobRepository = jobRepository; //Populated with Unity
}

public Task<int> CountMyJobsAsync(string name)
{
using (WindowsIdentity.GetCurrent().Impersonate())
{
//JobRepository is effectively a DbSet<Job> and this call returns IQueryable<Job>
return _jobRepository.Where(i => i.Name == name).CountAsync();
}
}
}

如果我将 using 语句移动到 Controller 中(包裹在 await 周围),它工作正常。

问题似乎是因为 await 在模拟上下文之外,它不会模拟数据库调用(CountAsync()),我无法打开与我的数据库的连接。

问题:

有没有一种方法可以在我的 Controller 方法上编写 ActionFilter 或其他一些属性,以便方法本身(包含 await 调用)自动包装在 using 语句中?

最佳答案

merpmerp 的回答在多线程服务器中会出现问题。由于每个修饰方法只有一个 ActionFilterAttribute 实例,因此对同一方法的两个同时请求将导致 usingVariable 被覆盖,最终只有一个被释放。

您需要更进一步,将 ImpersonationContext 存储在请求上下文中的某处——例如在 filterContext.Request.Properties 中。

关于c# - 有没有办法创建一个将 Action 的内容包装在 using 语句中的 ActionFilter?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23299186/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com