我有一个 VB.NET 的网站项目。在其中一个页面中,在单击按钮期间,它应该加载带有数据的telerik RadGrid
。它在我的本地计算机上工作正常。但是,当我将其部署到服务器上的预生产时,它会引发以下错误。
"实用工具"的类型初始值设定项引发异常
Utility
是一个静态类,在调用静态类的任何成员(公共静态函数或公共静态变量)时,我收到了此错误。
以下是代码片段:
Partial Class Session
Inherits System.Web.UI.Page
Protected Sub RadGrid1_ItemDataBound(sender As Object, e As Telerik.Web.UI.GridItemEventArgs) Handles RadGrid1.ItemDataBound
If TypeOf e.Item Is GridDataItem Then
Dim testString As String = String.Empty
Dim encryptString As String = String.Empty
Try
encryptString = Utility.EncryptString(cellValue.ToString())
testString = Utility.test
Catch ex As Exception
Logger.getInstance().log("Value1" & cellValue.ToString() & "Value2" & testString)
Finally
End Try
End If
End Sub
End Class
在我的实用程序.vb中,这就是我所拥有的:
Public Class Utility
Public Shared test As String = "hello"
Public Shared Function EncryptString(ByVal strEncrypted As String) As String
Try
Dim b As Byte() = System.Text.ASCIIEncoding.ASCII.GetBytes(strEncrypted)
Dim encryptedConnectionString As String = Convert.ToBase64String(b)
Return encryptedConnectionString
Catch ex As Exception
Logger.getInstance().log("Error occurred in Utility.vb while executing EncryptString method. nSOURCE: " & ex.Source.ToString() & "nMESSAGE: " & ex.Message.ToString() & "nTARGETSITE: " & ex.TargetSite.ToString() & "nSTACKTRACE: " & ex.StackTrace.ToString())
Logger.getInstance().log("nstrEncrypted: " & strEncrypted)
Finally
End Try
End Function
End Class
从我的日志记录语句中,我意识到错误在调用Utility
类时正好发生,因为我添加到EncryptString()
函数中的任何日志记录语句都没有显示在我的日志中。
我尝试注释掉EncryptString()
函数的代码,并在Utility
类中添加了一个名为test
的public static string
变量,并尝试从 Session.aspx.vb 的代码访问它。该字符串值也没有返回。
顺便说一下,我的所有代码都在同一个网站项目中。这个错误让我在过去的 2 天里发疯。就像我提到的,它在我的本地计算机上运行良好,但仅在预生产服务器上失败。代码是使用较旧的框架(我相信是 3.5)编写的,然后我们升级到 4.6.2 并迁移到新服务器。我们在新服务器上的迁移过程中遇到了这个问题。
好的,所以我解决了这个问题。在 Utility.vb 类的开头,有一些不受支持的加密算法变量声明。
Private Shared DES As New TripleDESCryptoServiceProvider
Private Shared MD5 As New MD5CryptoServiceProvider
FIPS 合规性在服务器上处于打开状态,我们已经知道这些算法不符合最新的 .net 框架。但是我没有意识到,即使只是这些声明也会引发误导性错误,因为它们并没有真正用于我的函数调用。
当我注释掉代码的这些部分时,它开始正常工作。
检查异常的 InnerException 属性。每当类初始值设定项失败时,原始异常都应设置为未处理异常的 InnerException 属性。
如果你想要一个真正的静态类,你需要把它变成一个模块,VB.Net。