Это случается не часто, но время от времени я получаю по электронной почте отчет об исключении, указывающий на этот кусочек кода.Мне интересно, если вы видите что-то не так со следующим кодом.Я не могу заставить его терпеть неудачу локально, и отслеживание данных с использованием точек останова всегда дает правильные результаты, шаг за шагом.
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;
}