我在我的应用程序中看似随机的NullReferenceExeceptions,并且无法追踪可能导致错误的原因。
我会尽力描述场景和设置。
非常感谢任何和所有建议!
C#.net 3.5 Forms Application,但我使用Phil Haack(http://haacked.com/archive/2008/03/11/using-routing-with-webforms.aspx)构建的WebFormRouting库来利用.net的路由库(通常与MVC一起使用) - 使用的内容url重写我的网址。
我的数据库有60个表。全部归一化。这只是一个庞大的应用程序。 (SQL server 2008)
所有查询都是在代码中使用Linq to SQL构建的(没有SP)。每次创建我的数据上下文的新实例。我只使用一个数据上下文,其中包含SQL Server中4个关系图中定义的所有关系。
创建了很多数据上下文。我让自动处理数据上下文的关闭。我听说双方是否应该自动关闭或自己关闭。在这种情况下,我不要自己做。
如果我正在创建大量数据上下文实例或只创建一个实例,那似乎无关紧要。
例如,我有一个投票按钮。使用以下代码,它可能在10-20次中出错。
protected void VoteUpLinkButton_Click(object sender, EventArgs e)
{
DatabaseDataContext db = new DatabaseDataContext();
StoryVote storyVote = new StoryVote();
storyVote.StoryId = storyId;
storyVote.UserId = Utility.GetUserId(Context);
storyVote.IPAddress = Utility.GetUserIPAddress();
storyVote.CreatedDate = DateTime.Now;
storyVote.IsDeleted = false;
db.StoryVotes.InsertOnSubmit(storyVote);
db.SubmitChanges();
// If this story is not yet published, check to see if we should publish it. Make sure that
// it is already approved.
if (story.PublishedDate == null && story.ApprovedDate != null)
{
Utility.MakeUpcommingNewsPopular(storyId);
}
// Refresh our page.
Response.Redirect("/news/" + category.UniqueName + "/"
+ RouteData.Values["year"].ToString() + "/"
+ RouteData.Values["month"].ToString() + "/"
+ RouteData.Values["day"].ToString() + "/"
+ RouteData.Values["uniquename"].ToString());
}
我尝试的最后一件事是SQL Server上的“自动关闭”标志设置。这被设置为true,我改为false。虽然总体效果很好,但似乎没有做到这一点。
这是一个没有抓到的详细信息。当我的try / catch's抓住时,我也会得到一些不同的错误。
System.Web.HttpUnhandledException: Exception of type 'System.Web.HttpUnhandledException' was thrown. --->
System.NullReferenceException: Object reference not set to an instance of an object. at
System.Web.Util.StringUtil.GetStringHashCode(String s) at
System.Web.UI.ClientScriptManager.EnsureEventValidationFieldLoaded() at
System.Web.UI.ClientScriptManager.ValidateEvent(String uniqueId, String argument) at
System.Web.UI.WebControls.TextBox.LoadPostData(String postDataKey, NameValueCollection postCollection) at
System.Web.UI.Page.ProcessPostData(NameValueCollection postData, Boolean fBeforeLoad) at
System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) --- End of inner exception stack trace --- at
System.Web.UI.Page.HandleError(Exception e) at System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) at
System.Web.UI.Page.ProcessRequest(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) at System.Web.UI.Page.ProcessRequest() at
System.Web.UI.Page.ProcessRequest(HttpContext context) at
ASP.forms_news_detail_aspx.ProcessRequest(HttpContext context) at
System.Web.HttpApplication.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() at
System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously)
HELP !!!
答案 0 :(得分:0)
从堆栈跟踪看起来与LINQ没什么关系。在Reflector中查看System.Web,似乎Page.RequestViewStateString
以某种方式为空。我在调试器中确认异常发生时并尝试跟踪那里发生的事情(使用Reflector)。
答案 1 :(得分:0)
来到这里。 http://forums.asp.net/t/1170677.aspx
其中涉及设置:在页面中设置enableEventValidation =“false”或在所有页面的web.config中设置。
我宁愿不必这样做,从技术上来说它并没有“修复”错误,只是通过外观避免它。
在现场网站上,我现在很乐意使用绑带。
感谢Evgeny,你让我走上正轨。我想我错误地怀疑Linq to SQL,而且堆栈跟踪应该更明显。
不幸的是(或幸运的是),我正在尝试很多'新东西',所以还有很多尚未看到的错误。