操作无效。连接已关闭。 ASP.NET MVC

时间:2011-01-02 13:14:59

标签: asp.net asp.net-mvc linq-to-sql

这种情况不会经常发生,但我会不时通过电子邮件向我发送一份异常报告,指出这段代码。我想知道你是否看到以下代码有任何问题。我不能让它在本地失败,并且使用断点跟踪数据总是一步一步地给出正确的结果。

namespace DomainModel.Concrete
{
public class ConfigRepository : IConfigRepository
{
    static mvCmsContext context { get; set; }
    public ConfigRepository() { context = new mvCmsContext(); }

    private static Func<mvCmsContext, string, Configuration> _byName =
        CompiledQuery.Compile((mvCmsContext context, string configName) =>
            (from c in context.Configs
             where c.configName == configName
             select c).SingleOrDefault());
    static public Configuration ByName(string configName)
    {
        var result = (Configuration)HttpContext.Current.Cache.Get(configName);
        if (result == null)
        {
            using (new mvCmsContext())
            {
                HttpContext.Current.Cache.Insert(configName, _byName(context, configName));
                result = (Configuration)HttpContext.Current.Cache.Get(configName);
            }
        }
        return result;
    }

}
}

以下是调用该方法的服务:

public class ConfigService
{
public static string siteName
{
    get { return ConfigRepository.ByName("Site_Name").configValue; }
}
public static string copyright
{
    get { return ConfigRepository.ByName("Copyright").configValue; }
}
public static string companyName
{
    get { return ConfigRepository.ByName("Company_Name").configValue; }
}
public static string homeTitle
{
    get { return ConfigRepository.ByName("Home_Title").configValue; }
}
public static string contactEmail
{
    get { return ConfigRepository.ByName("Contact_Email").configValue; }
}
public static string physicalAddress
{
    get { return ConfigRepository.ByName("Physical_Address").configValue; }
}
public static string phoneNumber
{
    get { return ConfigRepository.ByName("Phone_Number").configValue; }
}
}

以下是收到的报告:

  

**摘要**   ---------------此消息包含总计1中的事件1到1   为此安排的活动   通知。有0个事件   在开始时留在缓冲区中   这个通知。

     

**申请信息**   ---------------应用领域:/ LM / W3SVC / 66 / ROOT-7-129384226573152341   信任级别:完全应用程序虚拟   路径:/应用程序路径:   D:* * ***。com \机器名称:   WIN11

     

**活动**   ---------------事件代码:3005事件消息:未处理的异常   发生了。活动时间:1/2/2011   12:17:44 AM活动时间(UTC):1/2/2011   上午6:17:44活动ID:   f909c5c676bd4ca1ba21512c678ac502事件   sequence:6事件发生:1个事件   详细代码:0

     

流程信息:       进程ID:26904       进程名称:w3wp.exe       帐户名称:NT AUTHORITY \ NETWORK SERVICE

     

异常信息:       异常类型:System.InvalidOperationException       异常消息:无效的操作。连接已关闭。

     

请求信息:       请求网址:http:// .com / article / -ALERT       请求路径:/ article / III-ALERT       用户主机地址:68.230.129.53       用户:       经过身份验证:错误       验证类型:       线程帐户名称:NT AUTHORITY \ NETWORK SERVICE

     

主题信息:       主题ID:6       线程帐户名称:NT AUTHORITY \ NETWORK SERVICE       冒充:假       堆栈跟踪:在System.Data.SqlClient.SqlConnection.GetOpenConnection()   在   System.Data.SqlClient.SqlConnection.get_HasLocalTransactionFromAPI()   在   System.Data.SqlClient.SqlCommand.ValidateCommand(字符串   方法,布尔异步)at   System.Data.SqlClient.SqlCommand.RunExecuteReader(的CommandBehavior   cmdBehavior,RunBehavior runBehavior,   Boolean returnStream,String方法,   DbAsyncResult结果)at   System.Data.SqlClient.SqlCommand.RunExecuteReader(的CommandBehavior   cmdBehavior,RunBehavior runBehavior,   Boolean returnStream,String method)
  在   System.Data.SqlClient.SqlCommand.ExecuteReader(的CommandBehavior   行为,String方法)at   System.Data.SqlClient.SqlCommand.ExecuteDbDataReader(的CommandBehavior   行为)   System.Data.Linq.SqlClient.SqlProvider.Execute(表达式   查询,QueryInfo queryInfo,   IObjectReaderFactory工厂,对象[]   parentArgs,Object [] userArgs,   ICompiledSubQuery [] subQueries,Object   lastResult)at   System.Data.Linq.SqlClient.SqlProvider.ExecuteAll(表达式   query,QueryInfo [] queryInfos,   IObjectReaderFactory工厂,对象[]   userArguments,ICompiledSubQuery []   subQueries)at   System.Data.Linq.SqlClient.SqlProvider.CompiledQuery.Execute(IProvider   provider,Object [] arguments)at   System.Data.Linq.CompiledQuery.ExecuteQuery(的DataContext   context,Object [] args)at   System.Data.Linq.CompiledQuery.Invoke [TArg0,TArg1,TResult](TArg0   arg0,TArg1 arg1)at   DomainModel.Concrete.ConfigRepository.ByName(字符串   configName)at   DomainModel.Services.ConfigService.get_companyName()   在   ASP.views_shared_site_master ._ 渲染 _control1(HtmlTextWriter的   _.w,Control parameterContainer)在System.Web.UI.Control.RenderChildrenInternal(HtmlTextWriter)   作家,ICollection孩子们)   System.Web.UI.Control.RenderChildrenInternal(HtmlTextWriter的   作家,ICollection孩子们)   System.Web.UI.Page.Render(HtmlTextWriter的   作家)   System.Web.Mvc.ViewPage.Render(HtmlTextWriter的   作家)   System.Web.UI.Page.ProcessRequestMain(布尔   includeStagesBeforeAsyncPoint,Boolean   includeStagesAfterAsyncPoint)

如果我在错误的地方关闭datacontext,它会一直失败,不是吗?

编辑 - 数据上下文:

public class mvCmsContext : DataContext
{
    public mvCmsContext(): 
    base(ConfigurationManager.ConnectionStrings["ApplicationServices"].ConnectionString,XmlMappingSource.FromStream(Assembly.GetExecutingAssembly().GetManifestResourceStream("DomainModel.mvCmsMapping.map"))){
        Log = (StringWriter)HttpContext.Current.Items["linqToSqlLog"];
    }
public Table<DomainModel.Entities.Configuration> Configs { get { return this.GetTable<DomainModel.Entities.Configuration>(); } }
}    

编辑以添加更新: 这看起来更好吗?我会上传并试一试。

public class ConfigRepository : IConfigRepository
{
    private mvCmsContext context { get; set; }
    public ConfigRepository() { context = new mvCmsContext(); }

    private static Func<mvCmsContext, string, Configuration> _byName =
        CompiledQuery.Compile((mvCmsContext context, string configName) =>
            (from c in context.Configs
             where c.configName == configName
             select c).SingleOrDefault());
    static public Configuration ByName(string configName)
    {
        var result = (Configuration)HttpContext.Current.Cache.Get(configName);
        if (result == null)
        {
            using (var context = new mvCmsContext())
            {
                HttpContext.Current.Cache.Insert(configName, _byName(context, configName));
                result = (Configuration)HttpContext.Current.Cache.Get(configName);
            }
        }
        return result;
    }

1 个答案:

答案 0 :(得分:6)

您的问题是您将datacontext定义为静态。这意味着它由所有请求和线程共享。

如果有两个不同的请求命中静态datacontext,则会发生这种异常。 ByName中的using部分将重新创建并处理datacontext,想象另一个请求正在使用datacontext,而这样做.......因此有例外。

解决方案是使您的datacontext非静态。

相关问题