Странная ошибка ASP.NET AJAX / от 32-битной до 64-битной - PullRequest
5 голосов
/ 08 января 2009

Я получаю странную ошибку с моих сайтов с момента обновления до Windows 2008 64-bit. У меня большинство пулов приложений работает в 64-битном режиме (все, кроме одного, используются для устаревшего приложения ASP.NET 1.1). На сайтах, работающих на 64-битной версии, я получаю ошибки от ASP.NET AJAX.

Exception information:
   Exception type: System.NotSupportedException
   Exception message: Assembly "AjaxControlToolkit, Version=3.0.20820.16598, Culture=neutral, PublicKeyToken=28f01b0e84b6d53e" does not contain a script with hash code "e2e86ef9".

Request information:
   Request URL: http://site.com/page.aspx?_TSM_HiddenField_=ctl00_ctl00_elScripto_HiddenField&_TSM_CombinedScripts_=%3B%3BAjaxControlToolkit%2C+Version%3D3.0.20820.16598%2C+Culture%3Dneutral%2C+PublicKeyToken%3D28f01b0e84b6d53e%3Afr-FR%3A707835dd-fa4b-41d1-89e7-6df5d518ffb5%3Ae2e86ef9%3A9ea3f0e2%3A9e8e87e9%3A1df13a87%3Ad7738de7

Thread information:
   Thread ID: 21
   Thread account name: NT AUTHORITY\NETWORK SERVICE
   Is impersonating: False
   Stack trace:    at AjaxControlToolkit.ToolkitScriptManager.DeserializeScriptEntries(String serializedScriptEntries, Boolean loaded) in c:\AjaxControlToolkit_Admin\Release\AjaxControlToolkit\ToolkitScriptManager\ToolkitScriptManager.cs:line 534
  at AjaxControlToolkit.ToolkitScriptManager.OutputCombinedScriptFile(HttpContext context) in c:\AjaxControlToolkit_Admin\Release\AjaxControlToolkit\ToolkitScriptManager\ToolkitScriptManager.cs:line 264
  at AjaxControlToolkit.ToolkitScriptManager.OnInit(EventArgs e) in c:\AjaxControlToolkit_Admin\Release\AjaxControlToolkit\ToolkitScriptManager\ToolkitScriptManager.cs:line 198
  at System.Web.UI.Control.InitRecursive(Control namingContainer)
  at System.Web.UI.Control.InitRecursive(Control namingContainer)
  at System.Web.UI.Control.InitRecursive(Control namingContainer)
  at System.Web.UI.Control.InitRecursive(Control namingContainer)
  at System.Web.UI.Control.InitRecursive(Control namingContainer)
  at System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint)

Ошибка, похоже, известная проблема в CodePlex, но это мне мало помогает. Вот ссылка, объясняющая проблему: http://dotnetdebug.net/2008/05/25/ajaxcontroltoolkit-toolkitscriptmanager-stringgethashcode-and-mixing-32bit-and-64bit-machinesprocesses/

Я не использую балансировку нагрузки и мне интересно, почему мое приложение будет переключаться между 32-битным и 64-битным режимами.

Может ли быть так, что библиотеки DLL должны быть скомпилированы для 64-битной архитектуры или что-то в этом роде? Есть ли какие-то странные проблемы, о которых я должен знать, которые могут быть причиной этой проблемы для меня?

1 Ответ

3 голосов
/ 14 апреля 2009

Похоже, что результат String.GetHashCode () изменяется в зависимости от того, для какого набора команд был скомпилирован dll. Я не могу объяснить, почему это происходит внутри фреймворка, когда все ваши пулы приложений .NET 2.0+ являются 64-битными, но есть решение, которое вы можете попробовать, если хотите получить последний исходный код из кодекса и изменить несколько строк в ToolkitScriptManager.

Я не знаю, почему официальное исправление не было представлено на основании доступных комментариев - может быть, потому что все решения такие же уродливые, как и мое?

Я попытался исправить это с помощью процедуры хеширования SHA1, как описано в одном из комментариев - поэтому сначала я создал статический экземпляр поставщика SHA1Managed в классе ToolkitScriptManager, как показано ниже:

public class ToolkitScriptManager : ScriptManager
{
    private static System.Security.Cryptography.SHA1Managed s = new System.Security.Cryptography.SHA1Managed();

...

тогда есть два места, где использовался хеш-код строки, который я закомментировал и заменил - один раз в функции SerializeScriptEntries:

//serializedScriptEntries.Append(scriptEntry.Name.GetHashCode().ToString("x", CultureInfo.InvariantCulture));
serializedScriptEntries.Append(Convert.ToBase64String(s.ComputeHash(System.Text.Encoding.UTF8.GetBytes(scriptEntry.Name))));

, а затем один раз в функции DeserializeScriptEntries:

//string hashCode = resourceName.GetHashCode().ToString("x", CultureInfo.InvariantCulture);
string hashCode = Convert.ToBase64String(s.ComputeHash(System.Text.Encoding.UTF8.GetBytes(resourceName)));

Возможно, более простой метод позволил бы нам просто получить доступ к 64-битному методу GetHashCode для сериализации этой строки, чтобы мы получили одинаковые результаты для 32-битных и 64-битных вызовов ...

...