我没有尝试移植现有的 Web 应用程序以作为 Azure Web 角色运行。此应用程序使用 Oracle DB,我已使用其中一个可用的新映像将其安装在 Azure VM 上。
当我尝试从 Web 应用程序连接到数据库时出现问题。我能够从我的开发人员 PC(从 Visual Studio 使用 ODBC)连接到数据库,并且能够远程登录到端口,因此没有防火墙问题。
我正在使用这种技术:http ://www.splinter.com.au/using-the-new-odpnet-to-access-oracle-from-c/已经在网上的几个地方进行了描述,包括 StackOverflow 上的这里。唯一的区别是我使用 Oracle 12 而不是 11,并使用了适当的 64 位库。
我得到的错误不是很有描述性:
[OracleException (0x80004005)]
Oracle.DataAccess.Client.OracleException.HandleErrorHelper(Int32 errCode, OracleConnection conn, IntPtr opsErrCtx, OpoSqlValCtx* pOpoSqlValCtx, Object src, String procedure, Boolean bCheck, Int32 isRecoverable) +1199
Oracle.DataAccess.Client.OracleException.HandleError(Int32 errCode, OracleConnection conn, IntPtr opsErrCtx, Object src) +53
Oracle.DataAccess.Client.OracleConnection.Open() +4555
NHibernate.Connection.DriverConnectionProvider.GetConnection() +378
NHibernate.Tool.hbm2ddl.SuppliedConnectionProviderConnectionHelper.Prepare() +92
NHibernate.Tool.hbm2ddl.SchemaMetadataUpdater.GetReservedWords(Dialect dialect, IConnectionHelper connectionHelper) +154
NHibernate.Tool.hbm2ddl.SchemaMetadataUpdater.Update(ISessionFactory sessionFactory) +312
NHibernate.Impl.SessionFactoryImpl..ctor(Configuration cfg, IMapping mapping, Settings settings, EventListeners listeners) +1934
NHibernate.Cfg.Configuration.BuildSessionFactory() +292
FluentNHibernate.Cfg.FluentConfiguration.BuildSessionFactory() +54
[FluentConfigurationException: An invalid or incomplete configuration was used while creating a SessionFactory. Check PotentialReasons collection, and InnerException for more detail.
]
FluentNHibernate.Cfg.FluentConfiguration.BuildSessionFactory() +111
MAP.NHibernateHelper.CreateSessionFactory() in C:\ProjectSVN\FluentWims\DataAccessLayer\DataMapping\NHibernateHelper.vb:102
MAP.NHibernateHelper.get_SessionFactory() in C:\ProjectSVN\FluentWims\DataAccessLayer\DataMapping\NHibernateHelper.vb:16
(最后删除了一些行,因为它包含一些我不想公开分享的细节,我很确定它们无关紧要)
我已经反编译了托管代码(OracleDataAccess.dll)并将问题追溯到对这个包装的本机调用的调用:
<DllImport("OraOps12.dll", EntryPoint:="OpsConOpen", CallingConvention:=CallingConvention.Cdecl, CharSet:=CharSet.Unicode)> _
Public Shared Function Open(ByRef opsConCtx As IntPtr, ByRef opsErrCtx As IntPtr, ByRef pOpoConValCtx As OpoConValCtx, ByRef pOpoConRefCtx As OpoConRefCtx) As Integer
End Function
这会返回 -1,它不被识别为已知的错误代码,因此会创建这个异常,这意味着几乎没有任何意义(至少对我来说不是,即使在疯狂地谷歌搜索之后;))。
我已经检查过,如果我删除 OraOps12.dll,我会收到一条不同的错误消息,并且我在 ProcMon 中看到该文件实际上是在我放置它的位置找到的。我在网上几乎找不到任何关于 OraOps 的信息,以及此方法返回 -1 意味着什么。
有谁知道这里可能发生了什么,可能出了什么问题?
更新
我尝试使用网络监视器查看发送到 oracle 数据库的内容,但找不到任何流量 - 所以似乎调用了 OraOps,但它并没有达到尝试通信的程度与数据库服务器。
我使用的连接字符串是从 Visual Studio 中的工作连接复制/粘贴,所以我认为它是正确的。即使不是,我也希望得到一个更具描述性的错误消息......