2009-01-08 58 views
5

自升級到Windows 2008 64位以來,我收到了來自我的網站的奇怪錯誤。我的大部分應用程序池都以64位模式運行(除了一個之外,用於傳統的ASP.NET 1.1應用程序)。在64位上運行的網站上,我從ASP.NET AJAX獲取錯誤。奇怪的ASP.NET AJAX錯誤/ 32位到64位

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位體系結構或類似的東西被編譯?是否有任何奇怪的問題,我應該知道這可能會導致這個問題給我?

回答

3

它看起來像基於什麼指令集該dll被編譯爲String.GetHashCode()結果的變化。我無法解釋爲什麼在.NET 2.0或更高版本的應用程序池都是64位的情況下會發生這種情況,但如果您願意獲取最新的源代碼和更改幾行代碼,則可以嘗試解決此問題。 ToolkitScriptManager。

我不知道爲什麼根據可用評論沒有提交官方修復 - 也許是因爲所有的解決方案都和我一樣醜陋?

我已經試圖通過使用SHA1哈希程序作爲一個評論描述修復它 - 所以首先我創造了ToolkitScriptManager類SHA1Managed提供商的靜態實例,如下圖所示:

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位呼...

+0

看起來很有希望。我不想運行我自己的工具包管理器實例,但很樂意爲此解決方案進行投票,以便將其投入到主要產品中。 – 2009-04-16 15:59:50