当我试图调用经典ASP页面中的COM可视c#类时,我面临这个问题,它试图对数据库执行一个MySQL查询。(在这里,MySQL在TLS上)。
在我的例子中,经典的asp页面之一,我们创建SomeUser类的实例,然后调用将尝试创建MySQL连接的SetId方法,并在这个堆栈跟踪中失败。为了完全清楚起见,这里的SomeUser类是COMVisible。
经典ASP代码片段
dim dummy: set dummy= new SomeUser
dim dummyObj: set dummyObj= dummy.obj
dummyObj.SetId(ID)异常
System.Security.Cryptography.CryptographicException: The system cannot find the file specified.
at System.Security.Cryptography.CryptographicException.ThrowCryptographicException(Int32 hr)
at System.Security.Cryptography.X509Certificates.X509Utils._LoadCertFromFile(String fileName, IntPtr password, UInt32 dwFlags, Boolean persistKeySet, SafeCertContextHandle& pCertCtx) at System.Security.Cryptography.X509Certificates.X509Utils.LoadCertFromFile(String fileName, IntPtr password, UInt32 dwFlags, Boolean persistKeySet, SafeCertContextHandle pCertCtx)
at System.Security.Cryptography.X509Certificates.X509Certificate.LoadCertificateFromFile(String fileName, Object password, X509KeyStorageFlags keyStorageFlags)
at System.Security.Cryptography.X509Certificates.X509Certificate2..ctor(String fileName, String password) at MySql.Data.MySqlClient.NativeDriver.GetClientCertificates()
at MySql.Data.MySqlClient.NativeDriver.StartSSL() at MySql.Data.MySqlClient.NativeDriver.Open() at MySql.Data.MySqlClient.Driver.Open()
at MySql.Data.MySqlClient.Driver.Create(MySqlConnectionStringBuilder settings) at MySql.Data.MySqlClient.MySqlPool.CreateNewPooledConnection()
at MySql.Data.MySqlClient.MySqlPool.GetPooledConnection() at MySql.Data.MySqlClient.MySqlPool.TryToGetDriver() at MySql.Data.MySqlClient.MySqlPool.GetConnection()
at MySql.Data.MySqlClient.MySqlConnection.Open() at System.Data.Common.DbDataAdapter.FillInternal(DataSet dataset, DataTable[] datatables, Int32 startRecord, Int32 maxRecords, String srcTable, IDbCommand command, CommandBehavior behavior)
at System.Data.Common.DbDataAdapter.Fill(DataTable[] dataTables, Int32 startRecord, Int32 maxRecords, IDbCommand command, CommandBehavior behavior)
at System.Data.Common.DbDataAdapter.Fill(DataTable dataTable) at Some.Other.Namespace.Execute(MySqlConnection connection, String sql, DataTable table, DataParameter[] dataParameters) at Some.Other.Namespace.Execute(MySqlConnection connection, String sql, DataParameter[] dataParameters) at Some.Other.Namespace.Execute(String sql, DataParameter[] dataParameters)
at SomeNamespace.SomeDc.GetData(UInt32 Id) at
SomeNamespace.User.GetData(UInt32 ID) at SomeNameSpace.SomeUser.SetId(Int32 Id)Similar question on Stack Overflow在这上面。
在我的示例中,此解决方案(将Load用户配置文件设置为true)仅适用于ASPX页面,但在本例中不起作用。
还有一点我想强调的是,w3wp.exe运行在ApplicationPoolIdentity.的默认应用程序池中。
到目前为止,我已经尝试了很多东西,但没有运气。正确方向上的任何一点都会有很大帮助。
到目前为止,我已经尝试过的事情了。--
将所有应用程序的pools.
发布于 2022-05-17 00:14:23
我对ASP没有任何线索,所以我不明白你尝试了什么。
然而,异常日志似乎可以判断出出了什么问题。当连接到服务器时,ASP / COM应用程序试图加载一个MySQL客户端证书,但找不到相应的文件。这可能是由于权限造成的,也可能是由于该文件不存在而发生的。
请注意,这是一个不太常见的问题,可能会使您无法快速找到解决方案。证书的问题通常是由于服务器证书不受信任、撤销或过时所致。但是在这种情况下,COM部分试图加载一个客户端证书,以便它能够向服务器证明的 identity 。
解决问题的办法取决于情况:
不过,我不知道COM对象是如何工作的。即使您找不到它试图显式加载客户端证书的位置,它也可能评估一些MySQL客户端配置文件,这些文件告诉它在连接到服务器时使用(特定的)客户端证书。这些文件可能有mysql.ini、my.ini、my.cnf等名称.
澄清:上面的段落是关于MySQL客户端证书的MySQL TLS连接。这与web服务器证书无关。
如果需要MySQL客户端身份验证,则应逐步进行测试:
certificate.
如果这不起作用,很可能它不可能在COM对象中工作,因此您需要首先解决这个问题。
如果与本机客户端的连接成功,但COM对象仍然无法连接,我可能还想知道如何调试这种情况。在这种情况下,只需提出评论,我最终会修改这个答案。
https://stackoverflow.com/questions/72183698
复制相似问题