这种情况不会经常发生,但我会不时通过电子邮件向我发送一份异常报告,指出这段代码。我想知道你是否看到以下代码有任何问题。我不能让它在本地失败,并且使用断点跟踪数据总是一步一步地给出正确的结果。
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;
}
答案 0 :(得分:6)
您的问题是您将datacontext定义为静态。这意味着它由所有请求和线程共享。
如果有两个不同的请求命中静态datacontext,则会发生这种异常。 ByName中的using部分将重新创建并处理datacontext,想象另一个请求正在使用datacontext,而这样做.......因此有例外。
解决方案是使您的datacontext非静态。