Неверная операция. Соединение закрыто. ASP.NET MVC - PullRequest
4 голосов
/ 02 января 2011

Это случается не часто, но время от времени я получаю по электронной почте отчет об исключении, указывающий на этот кусочек кода.Мне интересно, если вы видите что-то не так со следующим кодом.Я не могу заставить его терпеть неудачу локально, и отслеживание данных с использованием точек останова всегда дает правильные результаты, шаг за шагом.

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 Время события (UTC): 1/2/2011 6:17:44 AM Идентификатор события: f909c5c676bd4ca1ba21512c678ac502 Последовательность событий: 6 Возникновение события: 1 Код детали события: 0

Информация о процессе: ИД процесса: 26904 Имя процесса: w3wp.exe Имя учетной записи: NT AUTHORITY \ NETWORK SERVICE

Информация об исключении: Тип исключения: System.InvalidOperationException Сообщение об исключении: недопустимая операция.Соединение закрыто.

Информация запроса: URL запроса: http://.com/article/-ALERT Путь запроса: / article / III-ALERT Адрес хоста пользователя: 68.230.129.53 Пользователь: Аутентифицирован: Тип ложной аутентификации: Имя учетной записи потока: NTAUTHORITY \ NETWORK SERVICE

Информация о потоке: Идентификатор потока: 6 Имя учетной записи потока: NT AUTHORITY \ NETWORK SERVICE олицетворяет: False Stack trace: at System.Data.SqlClient.SqlConnection.GetOpenConnection () в System.Data.SqlClient.SqlConnection.get_HasLocalTransactionFromAPI () в System.Data.SqlClient.SqlCommand.ValidateCommand (строковый метод, логический асинхронный) в System.Data.SqlClient.SqlCommand.в System.Data.SqlClient.SqlCommand.RunExecuteReader (CommandBehavior cmdBehavior, RunBehavior runBehavior, логический returnStream, метод String)
в System.Data.SqlClient.SqlCommand.ExecuteReior в поведениеSystem.Data.SqlClient.SqlCommand.ExecuteDbDataReader (поведение CommandBehavior) в System.Data.Linq.SqlClient.SqlProvider.Execute (запрос выражения, фабрика QueryInfo queryInfo, IObjectReaderFactory, объект [] parentArgs, объект ICI], объект [[], пользовательские объекты, ICU объекта], объект [[], пользовательские объекты, ICU объекта], [объект], пользовательский объект, ICQ, объект, объект, объект, [объект], объект, пользователь, объекты, объекты, объекты, объекты, [, объекты, пользователь, объекты, ИГ, объект,,,,,,,,,,,.Объект lastResult) в System.Data.Linq.SqlClient.SqlProvider.ExecuteAll (запрос на выражение, QueryInfo [] queryInfos, фабрика IObjectReaderFactory, объект [] userArguments, ICompiledSubQuery [] subQueries] в System.Data.Linqrov.qlSq.SlCQPВыполните (поставщик IProvider, аргументы Object []) в System.Data.Linq.CompiledQuery.ExecuteQuery (контекст DataContext, аргументы Object []) в System.Data.Linq.CompiledQuery.Invoke [TArg0, TArg1, TResult] (TArg0 arg0,TArg1 arg1) в DomainModel.Concrete.ConfigRepository.ByName (String configName) в DomainModel.Services.ConfigService.get_companyName () в ASP.views_shared_site_master ._ Render _control1 (Hert)..UI.Control.RenderChildrenInternal (писатель HtmlTextWriter, дочерние элементы ICollection) в System.Web.UI.Control.RenderChildrenInternal (писатель HtmlTextWriter, дочерние элементы ICollection) в System.Web.UI.Page.Render (писатель HtmlTextWriter.R ).R.(HtmlTextWriterWriter) в System.Web.UI.Page.ProcessRequestMain (Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint)

Если бы я закрывал текстовый текст в неправильном месте, он бы не работал все время, не так ли?

Правка - Контекст данных:

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 Ответ

6 голосов
/ 02 января 2011

Ваша проблема в том, что вы определяете ваш текст данных как статический. Это означает, что он является общим для всех запросов и потоков.

Когда у вас есть два разных запроса, попадающих в ваш статический текст данных, возникают исключения подобного рода. Ваш раздел использования в ByName воссоздает и удаляет текст данных, представьте, что другой запрос использует текст данных во время выполнения вами ....... отсюда исключения.

Решение состоит в том, чтобы сделать ваш текст данных нестатичным.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...