每个请求的连接

时间:2014-08-05 15:04:49

标签: c# .net asp.net-mvc asynchronous async-await

我正在尝试在我的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;
        }
    }

2 个答案:

答案 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();