Проблемы параллелизма с ScriptManager
Я знаю, что Asp.Net WebForms довольно старый и устаревший, но я надеюсь, что все еще есть люди, поддерживающие такую устаревшую кодовую базу...
Я вижу странные ошибки при нагрузочном тестировании нашего веб-сайта, которые, похоже, сводятся к проблемам параллелизма в том, как.Net обрабатывает ссылки на скрипты на странице. Я могу увидеть сообщения о проблеме, возникшей в 2007 году, здесь: ScriptManager выдает "Запись с таким же ключом уже существует".,
Я использую.Net 4.7.2, и вот пример ошибок, которые происходят под нагрузкой:
Ошибка 1 ArgumentException: запись с таким же ключом уже существует.
at System.Collections.Specialized.ListDictionary.Add(Object key, Object value)
at System.Web.UI.ClientScriptManager.RegisterScriptBlock(ScriptKey key, String script, ListDictionary& scriptBlocks, ArrayList& scriptList, Boolean needsScriptTags)
at System.Web.UI.ClientScriptManager.RegisterScriptBlock(ScriptKey key, String script, ClientAPIRegisterType type)
at System.Web.UI.ScriptRegistrationManager.RegisterClientScriptInclude(Control control, Type type, String key, String url)
at System.Web.UI.ScriptManager.RegisterClientScriptIncludeInternal(Control control, Type type, String key, String url)
at System.Web.UI.ScriptManager.RegisterUniqueScripts(List'1 uniqueScripts)
at System.Web.UI.ScriptManager.RegisterScripts()
at System.Web.UI.ScriptManager.OnPagePreRenderComplete(Object sender, EventArgs e)
at System.Web.UI.Page.OnPreRenderComplete(EventArgs e)
at System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint)
Ошибка 2 IndexOutOfRangeException: индекс находился за пределами массива.
at System.Collections.Generic.List'1.Add(T item)
at System.Web.UI.ScriptRegistrationManager.RegisterClientScriptInclude(Control control, Type type, String key, String url)
at System.Web.UI.ScriptManager.RegisterClientScriptIncludeInternal(Control control, Type type, String key, String url)
at System.Web.UI.ScriptManager.RegisterUniqueScripts(List'1 uniqueScripts)
at System.Web.UI.ScriptManager.RegisterScripts()
at System.Web.UI.ScriptManager.OnPagePreRenderComplete(Object sender, EventArgs e)
at System.Web.UI.Page.OnPreRenderComplete(EventArgs e)
at System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint)
Ошибка 3 Ссылка на объект не установлена на экземпляр объекта.
at System.Web.UI.ClientScriptManager.RenderRegisteredScripts(HtmlTextWriter writer, ArrayList scripts, Boolean checkForScriptManagerRegistrations)
at System.Web.UI.ClientScriptManager.RenderClientScriptBlocks(HtmlTextWriter writer)
at System.Web.UI.Page.BeginFormRender(HtmlTextWriter writer, String formUniqueID)
at System.Web.UI.HtmlControls.HtmlForm.RenderChildren(HtmlTextWriter writer)
at System.Web.UI.HtmlControls.HtmlContainerControl.Render(HtmlTextWriter writer)
at System.Web.UI.Control.RenderControlInternal(HtmlTextWriter writer, ControlAdapter adapter)
at System.Web.UI.HtmlControls.HtmlForm.RenderControl(HtmlTextWriter writer)
at ASP.masters_site_master.__RenderHtml(HtmlTextWriter __w, Control parameterContainer)
at System.Web.UI.Control.RenderChildrenInternal(HtmlTextWriter writer, ICollection children)
at System.Web.UI.HtmlControls.HtmlContainerControl.Render(HtmlTextWriter writer)
at System.Web.UI.Control.RenderControlInternal(HtmlTextWriter writer, ControlAdapter adapter)
at System.Web.UI.Control.RenderChildrenInternal(HtmlTextWriter writer, ICollection children)
at System.Web.UI.Control.RenderControlInternal(HtmlTextWriter writer, ControlAdapter adapter)
at System.Web.UI.Control.RenderChildrenInternal(HtmlTextWriter writer, ICollection children)
at System.Web.UI.Control.RenderControlInternal(HtmlTextWriter writer, ControlAdapter adapter)
at System.Web.UI.Control.RenderChildrenInternal(HtmlTextWriter writer, ICollection children)
at System.Web.UI.Page.Render(HtmlTextWriter writer)
at System.Web.UI.Control.RenderControlInternal(HtmlTextWriter writer, ControlAdapter adapter)
at System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint)
Глядя на исходный код из.Net, единственная возможность, что эти ошибки могут возникнуть, это многопоточность. Я вижу, что некоторые поля и методы внутри статичны ScriptManager
а также ClientScriptManager
что может объяснить это, хотя я не нашел верного сценария, где произошел бы параллелизм.
Кто-нибудь видел, решил или обойти эту проблему?