1日に数回、次の例外がWebフォームアプリケーションからスローされます。アプリケーションには、メニューを含むマスターページがあります。例外は次のとおりです。
01/10/13 23:57:10.481 ERROR 79 LonelyCache.Global - Exception occurred:
System.Web.HttpUnhandledException (0x80004005): Exception of type 'System.Web.HttpUnhandledException' was thrown. ---> System.InvalidOperationException: Collection was modified; enumeration operation may not execute.
at System.Web.UI.WebControls.MenuItemCollection.MenuItemCollectionEnumerator.MoveNext()
at System.Web.UI.WebControls.Menu.MenuRendererStandards.RenderItems(HtmlTextWriter writer, Boolean staticOnly, MenuItemCollection items, Int32 level, Boolean needsAccessKey)
at System.Web.UI.WebControls.Menu.MenuRendererStandards.RenderContents(HtmlTextWriter writer, Boolean staticOnly)
at System.Web.UI.WebControls.Menu.Render(HtmlTextWriter writer)
at System.Web.UI.Control.RenderChildrenInternal(HtmlTextWriter writer, ICollection children)
at System.Web.UI.HtmlControls.HtmlForm.RenderChildren(HtmlTextWriter writer)
at System.Web.UI.HtmlControls.HtmlContainerControl.Render(HtmlTextWriter writer)
at System.Web.UI.Control.RenderChildrenInternal(HtmlTextWriter writer, ICollection children)
at System.Web.UI.Control.RenderChildrenInternal(HtmlTextWriter writer, ICollection children)
at System.Web.UI.Page.Render(HtmlTextWriter writer)
at System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint)
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.geocacherpage_aspx.ProcessRequest(HttpContext context) in c:\Windows\Microsoft.NET\Framework64\v4.0.30319\Temporary ASP.NET Files\root\9b853d2b\87164de6\App_Web_qxpnvss5.10.cs:line 0
at System.Web.HttpApplication.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute()
at System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously)
マスターページのメニューが唯一のメニューなので、例外はそれに関連付けられている必要があると思います。
例外は、メニューが繰り返されている間にメニューが変更されたことを意味します。メニューを変更する唯一のコードは、メニューをクリアし、マスターページがロードされたときにメニューをビルドすることです。少なくともそれは私の理解です。
これは断続的な問題です。つまり、本番サイトでは1日に数回しか発生しません。メニューが正しく表示されないことがあります(一部の項目が欠落しています)。これは、この例外が発生した結果だと思います。
これが発生する原因について誰かが何か考えを持っていますか?
以下は、メニューに関連付けられているすべてのコードです。
Site.Masterファイルから:
<div class="menuSide">
<asp:Menu ID="NavigationMenu" runat="server" CssClass="menu" EnableViewState="false" IncludeStyleBlock="false" Orientation="Horizontal" />
</div>
Site.Master.csファイルから:
public partial class SiteMaster : System.Web.UI.MasterPage
{
private static readonly ILog log = LogManager.GetLogger(typeof(SiteMaster));
public class NavMenu
{
private readonly bool anonymous;
private readonly string role;
private readonly MenuItem menuItem;
public NavMenu(bool anon, string rol, MenuItem item)
{
anonymous = anon; role = rol; menuItem = item;
}
public bool Anonymous { get { return anonymous; } }
public string Role { get { return role; } }
public MenuItem Item { get { return menuItem; } }
}
static readonly NavMenu[] menu =
{
new NavMenu(true, null, new MenuItem("HOME", "", "", "~/")),
new NavMenu(false, null, new MenuItem("PROFILE", "", "", "~/Account/Profile.aspx")),
new NavMenu(true, null, new MenuItem("FORUM", "", "", "~/forum")),
new NavMenu(true, null, new MenuItem("ABOUT", "", "", "~/About.aspx")),
new NavMenu(false, "Administrators", new MenuItem("ADMIN", "", "", "~/Admin/Admin.aspx")),
};
private void buildMenu()
{
NavigationMenu.Items.Clear();
foreach (var item in menu)
{
if (item.Anonymous ||
(HttpContext.Current.User.Identity.IsAuthenticated &&
(item.Role == null || HttpContext.Current.User.IsInRole(item.Role))))
{
NavigationMenu.Items.Add(item.Item);
}
}
}
protected void Page_Load(object sender, EventArgs e)
{
buildMenu();
// More stuff follows...
}
}