2009-01-08 34 views
5

Windows 2008 64-bit'e yükselttikten sonra sitelerimden çok tuhaf bir hata alıyorum. Uygulama havuzlarımın çoğu 64 bit modunda çalışıyor (tümü eski bir ASP.NET 1.1 uygulaması için kullanılıyor). 64-bit üzerinde çalışan sitelerde, ASP.NET AJAX'tan hatalar alıyorum.Garip ASP.NET AJAX Hata/32 bit 64-bit

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) 

Hata CodePlex'te bilinen bir sorun gibi görünüyor, ancak bu bana fazla yardımcı olmuyor. İşte bu sorunu açıklayan bir bağlantı:http://dotnetdebug.net/2008/05/25/ajaxcontroltoolkit-toolkitscriptmanager-stringgethashcode-and-mixing-32bit-and-64bit-machinesprocesses/

Yük dengelemeyi kullanmıyorum ve uygulamamın neden 32 bit ve 64 bit modları arasında geçiş yapacağını merak ediyorum.

DLL'lerin 64 bitlik bir mimari veya bunun gibi bir şey için derlenmesi gerekir mi? Benim için bu soruna neden olabileceğinin farkında olmam gereken garip sorunlar var mı?

cevap

3

String.GetHashCode() sonucunun, dll'nin hangi komut için derlendiğine bağlı olarak değiştiği anlaşılıyor. .NET 2.0+ uygulama havuzlarınızın 64 bit olduğu durumlarda bunun neden gerçekleştiğini açıklayamıyorum, ancak en yeni kaynak kod kapalı kod satırını kapmak ve birkaç satırda değişiklik yapmak istediğinizde deneyebileceğiniz bir çözüm var. ToolkitScriptManager.

Mevcut yorumlar temelinde neden bir resmi düzeltme gönderilmediğini bilmiyorum - belki tüm çözümler benimki kadar çirkin olduğu için?

Ben yorumların birinde anlatıldığı gibi SHA1 karma yordamı kullanarak düzeltmek için teşebbüs ettik - bu yüzden ilk ben ToolkitScriptManager sınıfında SHA1Managed sağlayıcı statik bir örneği oluşturdu aşağıda gösterildiği gibi:

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

//serializedScriptEntries.Append(scriptEntry.Name.GetHashCode().ToString("x", CultureInfo.InvariantCulture)); 
serializedScriptEntries.Append(Convert.ToBase64String(s.ComputeHash(System.Text.Encoding.UTF8.GetBytes(scriptEntry.Name)))); 
: bir kez SerializeScriptEntries işlevinde -

...

sonra dize hash kodu ben dışarı yorumladı kullanılan ve yerine ediliyordu iki yer vardır

ve sonra bir kez DeserializeScriptEntries işlevinde:

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

Belki daha basit bir yöntem biz 32-bit ve 64 için aynı sonuçları elde edecek, böylece sadece bu dize seri hale 64 bit GetHashCode yöntemi erişmesine izin verecek -bit çağrılar ...

+0

Umut verici görünüyor. Araç yöneticisi için kendi örneğimi çalıştırmak istemiyorum, ancak ana ürüne aktarılacak şekilde bu çözüm için oy vermekten mutluluk duyarım. –