2009-01-08 41 views
5

Tôi nhận được một lỗi lạ từ các trang web của mình kể từ khi nâng cấp lên Windows 2008 64 bit. Tôi có hầu hết các hồ bơi ứng dụng chạy ở chế độ 64 bit (tất cả trừ một, được sử dụng cho ứng dụng ASP.NET 1.1 cũ). Trên các trang web đang chạy trên 64-bit, tôi đã nhận được lỗi từ ASP.NET AJAX.Lỗi AJAX ASP.NET AJAX/32-bit đến 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) 

Lỗi này dường như là sự cố đã biết trong CodePlex nhưng điều đó không giúp ích nhiều cho tôi. Đây là liên kết giải thích sự cố: http://dotnetdebug.net/2008/05/25/ajaxcontroltoolkit-toolkitscriptmanager-stringgethashcode-and-mixing-32bit-and-64bit-machinesprocesses/

Tôi không sử dụng cân bằng tải và tự hỏi tại sao ứng dụng của tôi chuyển đổi giữa chế độ 32 bit và 64 bit.

Có thể nào các tệp DLL phải được biên dịch cho kiến ​​trúc 64 bit hoặc tương tự như vậy? Có bất kỳ vấn đề lạ tôi cần phải nhận thức được rằng có thể gây ra vấn đề này cho tôi?

Trả lời

3

Dường như kết quả của String.GetHashCode() thay đổi dựa trên những gì bộ lệnh dll đã được biên dịch. Tôi không thể giải thích tại sao điều này xảy ra trong khuôn khổ khi các ứng dụng .NET 2.0+ của bạn là tất cả 64 bit nhưng có một giải pháp mà bạn có thể thử nếu bạn sẵn sàng lấy nguồn mã nguồn mới nhất và thay đổi một vài dòng trong ToolkitScriptManager.

Tôi không biết tại sao sửa lỗi chính thức chưa được gửi dựa trên các nhận xét có sẵn - có thể vì tất cả các giải pháp đều xấu xí như tôi?

Tôi đã cố gắng sửa chữa nó bằng cách sử dụng các thói quen băm SHA1 như mô tả trong một trong những ý kiến ​​- vì vậy đầu tiên tôi tạo ra một trường hợp tĩnh của nhà cung cấp SHA1Managed trong lớp ToolkitScriptManager như hình dưới đây:

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

...

sau đó có hai nơi mà mã chuỗi băm đã được sử dụng mà tôi nhận xét ra và thay thế - lần trong SerializeScriptEntries chức năng:

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

và sau đó một lần trong DeserializeScriptEntries chức năng:

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

Có lẽ một phương pháp đơn giản sẽ cho phép chúng ta chỉ cần truy cập các phương pháp GetHashCode 64-bit cho serializing chuỗi này để chúng tôi có được kết quả tương tự cho 32-bit và 64 các cuộc gọi -bit ...

+0

Có vẻ đầy hứa hẹn. Tôi không muốn chạy trình quản lý bộ công cụ của riêng mình nhưng sẽ rất vui khi bỏ phiếu cho giải pháp này để nó được đưa vào sản phẩm chính. –