asp.net-mvc – 具有持久HTTP连接的IDbConnection生命周期管理
|
当我的ASP.NET MVC应用程序中存在持久HTTP连接(如SignalR集线器)时,我在管理具有作用于HttpContext的StructureMap的开放数据库连接的生命周期时遇到问题. 我的DI容器StructureMap将一个打开的IDbConnection注入到多个服务中.为确保关闭并正确处理这些数据库连接,我在EndRequest事件上调用ObjectFactory.ReleaseAndDisposeAllHttpScopedObjects(). 这对于MVC控制器非常有用,直到需要数据库连接的服务注入到SignalR集线器中,从而为每个客户端保持持久的HTTP连接,并最终使连接池饱和. 如果我将IDbConnection范围限定为单例,则每个应用程序只打开一个连接,并且池不会饱和,但如果连接被锁定或超时,则为a bad idea. 那么也许有一种方法可以自定义SignalR集线器的数据库连接范围?我尝试在每个Hub方法中解析服务实例,但这仍然在HttpContext范围内实例化数据库连接,并在调用客户端的集线器连接期间保持打开状态. 当存在持久的HTTP连接时,如何在HTTP范围的上下文中管理与StructureMap的数据库连接的生命周期? 示例代码 典型服务 public class MyService
{
private IDbConnection _con;
public MyService(IDbConnection con)
{
_con = con;
}
public IEnumerable<string> GetStuff()
{
return _con.Select<string>("SELECT someString FROM SomeTable").ToList();
}
}
典型的SignalR Hub public class MyHub : Hub
{
private MyService _service;
public MyHub(MyService service)
{
_service = service; // Oh Noes! This will open a database connection
// for each Client because of HttpContext scope
}
public Task AddMessage()
{
var result = _service.GetStuff();
// ...
}
}
StructureMap配置 For<IDbConnection>()
.HybridHttpOrThreadLocalScoped()
.Use(() => BaseController.GetOpenConnection(MyConnectionString));
的Global.asax.cs public class GlobalApplication : System.Web.HttpApplication
{
public GlobalApplication()
{
EndRequest += delegate
{
ObjectFactory.ReleaseAndDisposeAllHttpScopedObjects();
};
}
// ...
}
解决方法在SignalR 1.0.0 Alpha中,Hub的实现IDisposable.与HttpContext不同,SignalR Hub实例是短暂的,因此如果您在Hub的Dispose方法中关闭IDbConnection,则不应该不必要地使连接池饱和.(编辑:安卓应用网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- OWIN上的CORS和访问/令牌导致“Access-Control-Allow-Origi
- 从.NET开始 – ASP.NET,WPF,Silverlight或命令行C#?
- asp.net – 使下拉列表项不可选
- asp.net-mvc – 我应该每个请求使用一个HttpClient实例来处
- asp.net-mvc – 我应该使用AsyncController在ASP.NET MVC 4
- 使用ASP.NET窗体身份验证的WCF服务
- asp.net-mvc – 使用ViewData或不使用ViewData
- asp.net-mvc – 是否可以在MVC控制器中的一个操作上禁用授权
- asp.net-mvc – Asp.Net MVC:一些非本地化的默认错误消息?
- asp.net-mvc – 转换常规的MVC网站,用于电话沟通
- asp.net-membership – 成员资格超时和会话超时
- asp.net-mvc-4 – signalR:/ signalr/hubs不生成
- asp.net – 如何在asp标签中将文本与中心对齐
- asp.net-mvc – ASP.NET MVC Action被调用两次
- 在我的ASP.NET MVC站点区域中执行全局视图数据的
- 从asp.net中的gridview获取已检查的行
- asp.net-mvc – “挑战”一词代表什么?
- asp.net-mvc – 在MVC身份(2.0.1)中的regenerate
- asp.net – 为什么Request.IsSecureConnection返
- asp.net-mvc – 如何将MVC路由添加到特定控制器?
