2010-04-13 49 views
1

我在我的應用程序的隨機時間看到NullReferenceExeceptions,無法追查可能導致錯誤的原因。Linq to SQL NullReferenceException:乾草堆中的隨機針!

我會盡我所能來描述場景和設置。

任何和所有的建議非常感謝!

  • C#.NET 3.5窗體應用程序,但我用菲爾哈克(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被抓到時,我也會得到幾乎不同的錯誤。

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

順便說一下,我在頁面上使用了一些Telerik控件。如果有人認爲這可能會導致錯誤。在儀表板上,我使用RadDock,它比我想要的要慢,但我不知道它是罪魁禍首。 – Shane 2010-04-13 22:34:51

回答

0

從堆棧跟蹤看,它看起來不像LINQ的任何事情。在Reflector中查看System.Web,看起來Page.RequestViewStateString以某種方式爲空。我會在調試器中確認發生異常時,並嘗試追蹤從那裏發生的事情(使用反射器)。

+0

謝謝Evgeny,現在看看。 – Shane 2010-04-13 23:28:01

0

哦,男孩,手指交叉。

來過這個。 http://forums.asp.net/t/1170677.aspx

它在頁面或web.config中爲所有頁面設置:enableEventValidation =「false」。

我寧願不必這樣做,在技術上它不能「修復」錯誤,只是通過外觀避免它。

在生活網站上,我現在很樂意帶上一個創可貼。

謝謝Evgeny,你讓我走上正軌。我想我錯誤地懷疑Linq到SQL,它應該可能從棧跟蹤更明顯。

不幸的是(或者幸運的是),我正在嘗試很多'新東西',所以很多還沒有看到的錯誤。