我正在尝试在我的Web应用程序中为每个请求维护一个连接。
在第一次尝试连接数据库的每个请求时,我创建了一个新的连接实例并将其存储在HttpContext.Current.Items
中,这在传统的Web应用程序中运行良好,但是当我使用异步时这一切都崩溃了等待。
问题是当从异步方法调用时httpContact.Current
返回null,(我猜这是因为current绑定到原始线程?)。
是否有替代方案允许我按照请求创建和处理我的连接,并且在使用异步等待时仍然有效?
编辑:按要求编写代码示例
public static DatabaseContext Context
{
get
{
if (HttpContext.Current.Items.Contains(DbContextKey))
{
return (DatabaseContext)HttpContext.Current.Items[DbContextKey];
}
var context = new DatabaseContext();
HttpContext.Current.Items.Add(DbContextKey, context);
return context;
}
}
答案 0 :(得分:3)
要在HttpContext
次来电之间移动async-await
,您可以在应用配置中将aspnet:UseTaskFriendlySynchronizationContext
设置为true
。
来自MSDN:
如果此键值设置为false [default],则ASP.NET 4.5中的异步代码路径的行为与在ASP.NET 4.0中的行为相同。如果此键值设置为true,则ASP.NET 4.5使用针对任务返回API优化的代码路径。对于启用WebSockets的应用程序,在Web窗体页中使用基于任务的异步以及某些其他异步行为,必须设置此兼容性开关。 这将使您的ASP.NET应用程序使用新的
AspNetSynchronizationContext
而不是LegacyAspNetSynchronizationContext
:
<appSettings>
<add key="aspnet:UseTaskFriendlySynchronizationContext" value="true" />
</appSettings>
您可以在What's the meaning of "UseTaskFriendlySynchronizationContext"?和Understanding the SynchronizationContext in ASP.NET
中详细了解相关信息答案 1 :(得分:-2)
您可以使用ado.net
实现单例模式using System;
using System.Data;
using System.Data.SqlClient;
public class ConnSingleton{
public static SqlConnection connInstance = null ;
public static Object obj = new Object();
public static SqlConnection GetInstance(string connstring)
{
if (connInstance == null)
{
lock(obj){
if (connInstance == null)
{
connInstance = new SqlConnection (connstring);
}
}
}
return connInstance ;
}
}
<强>用法强>
ConnSingleton.GetInstance("your connection string").Open();