2009-01-08 26 views
5

Recibo un extraño error de mis sitios desde que actualicé a Windows 2008 de 64 bits. Tengo la mayoría de mis grupos de aplicaciones ejecutándose en modo de 64 bits (todos menos uno, usados ​​para una aplicación heredada de ASP.NET 1.1). En los sitios que se ejecutan en 64 bits, he estado recibiendo errores de ASP.NET AJAX.Wendy ASP.NET AJAX Error/32 bits a 64 bits

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) 

El error parece ser un problema conocido en CodePlex, pero eso no me ayuda demasiado. Aquí hay un enlace que explica el problema: http://dotnetdebug.net/2008/05/25/ajaxcontroltoolkit-toolkitscriptmanager-stringgethashcode-and-mixing-32bit-and-64bit-machinesprocesses/

No estoy utilizando el equilibrio de carga y me pregunto por qué mi aplicación estaría cambiando entre los modos de 32 bits y 64 bits.

¿Es posible que las DLL se compilen para una arquitectura de 64 bits o algo así? ¿Hay algún problema extraño que deba tener en cuenta que podría estar causando este problema para mí?

Respuesta

3

Parece que el resultado String.GetHashCode() se basa en el conjunto de instrucciones para el que se compiló el dll. No puedo explicar por qué ocurre esto dentro del marco cuando sus pools de aplicaciones .NET 2.0+ son todos de 64 bits, pero hay una solución que puede probar si está dispuesto a tomar la última fuente de codeplex y cambiar algunas líneas en el ToolkitScriptManager.

No sé por qué no se ha enviado una solución oficial en función de los comentarios disponibles, tal vez porque todas las soluciones son tan feas como la mía.

he intentado solucionarlo mediante el uso de la rutina de hash SHA1 como se describe en uno de los comentarios - por lo que primero creé una instancia estática del proveedor SHA1Managed en la clase ToolkitScriptManager como se muestra a continuación:

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

...

entonces hay dos lugares en los que se estaba utilizando el código de cadena de hash que os comento y sustituido - una vez en la función SerializeScriptEntries:

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

y luego una vez en la función DeserializeScriptEntries:

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

Tal vez un método más simple nos permitiría sólo el acceso al método GetHashCode de 64 bits para la serialización de esta cadena para que podamos obtener los mismos resultados para los 32 bits y 64 -bit llama ...

+0

Parece prometedor. No quiero ejecutar mi propia instancia del administrador del kit de herramientas, pero estaría feliz de votar esta solución para que se incluya en el producto principal. –

Cuestiones relacionadas