ToolkitScriptManager создает исключение NullReferenceException при одновременном доступе к странице в первый раз - PullRequest
1 голос
/ 14 мая 2010

Я занимаюсь разработкой веб-приложения ASP.NET, в котором используется AjaxControlkit 3.0.30512.20315. У меня есть ToolkitScriptManager экземпляр на моей главной странице, в котором есть ScriptReferences в коллекции CombineScripts. Если после iisreset я получаю доступ к странице по умолчанию от двух разных клиентов, я получаю следующее исключение

[NullReferenceException: Object Reference not set to an instance of an object.]
   System.Collections.Generic.Dictionary`2.Insert(TKey key, TValue value, Boolean add) +143
   System.Collections.Generic.Dictionary`2.set_Item(TKey key, TValue value) +11
   AjaxControlToolkit.ToolkitScriptManager.GetScriptCombineAttributes(Assembly assembly) +129
   AjaxControlToolkit.ToolkitScriptManager.IsScriptCombinable(ScriptEntry scriptEntry) +148
   AjaxControlToolkit.ToolkitScriptManager.OnResolveScriptReference(ScriptReferenceEventArgs e) +415
   System.Web.UI.ScriptManager.RegisterScripts() +191
   System.Web.UI.ScriptManager.OnPagePreRenderComplete(Object sender, EventArgs e) +113
   System.Web.UI.Page.OnPreRenderComplete(EventArgs e) +8698462
   System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) +1029

Используя .NET Reflector, я обнаружил, что метод GetScriptCombineAttributes обращается к static dictionary, то есть not protected against concurrent access. Либо у меня в коде есть условие гонки, либо в AjaxToolkit.

есть ошибка.

Кто-нибудь может дать мне подсказку об этом?

Заранее спасибо

1 Ответ

0 голосов
/ 13 декабря 2010

Эта ошибка была впервые официально зарегистрирована на веб-сайте ASP.NET AJAX Control Toolkit 1 июня 2010 года. Проблема была закрыта в соответствии с решением 23 января 2013 года:

http://ajaxcontroltoolkit.codeplex.com/workitem/26752

Сэто происходит в части страницы конвейера ASP.NET, вы можете попробовать переопределить метод OnPreRenderComplete, чтобы реализовать механизм блокировки для блокировки запросов до тех пор, пока первый не завершится успешно.Даже самая легкая реализация будет влиять на каждый запрос, поэтому вы можете включить его только на страницу входа или что-то подобное (в сценарии, когда никакая другая страница не будет отображать что-либо, поскольку пользователи не вошли в систему).Если ошибка происходит по всему вашему сайту, блокировка, вероятно, окажется в базовом классе каждой страницы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...