2009-01-08 72 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