【问题标题】:Windows Service in .net cannot resolve tns service name.net 中的 Windows 服务无法解析 tns 服务名称
【发布时间】:2010-10-16 19:52:25
【问题描述】:

我已将我们应用程序的一个组件从 Web 服务移至 Windows 服务。它从 web 服务完美地连接到 oracle,但拒绝从 Windows 服务中看到 Tns 名称。我已经完全控制了运行该服务的帐户的 ORAHOME 目录。

我还通过使用 runas regedit 作为服务帐户检查了注册表的服务帐户权限,它可以看到 HKLM\SOFTWARE\ORACLE\HOME0 详细信息和 HKLM\SOFTWARE\ORACLE\ALL_HOMES。所有的 ORACLE_HOME 键都指向同一个目录。

我可以以服务帐户身份登录并 TNSPing sid 'UAT' 没有问题:

'OK (70 msec)'

我已将进程监视器附加到进程,服务帐户(最终在扫描大部分注册表后)看到 tnsnames.ora 甚至读取它。

你在键盘后面咯咯地笑吗?你能帮忙吗!

Cause: OracleException

Source: System.Data.OracleClient Message: ORA-12154: TNS:could not resolve service name at System.Data.ProviderBase.DbConnectionPool.GetConnection(DbConnection owningObject) at System.Data.ProviderBase.DbConnectionFactory.GetConnection(DbConnection owningConnection) at System.Data.ProviderBase.DbConnectionClosed.OpenConnection(DbConnection outerConnection, DbConnectionFactory connectionFactory) at System.Data.OracleClient.OracleConnection.Open()

【问题讨论】:

    标签: .net oracle windows-services windows-server-2003


    【解决方案1】:

    首先您可以更改连接字符串以展开 tns 条目:

    Data Source=(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=10.161.50.101)(PORT=1521))(CONNECT_DATA=(SERVICE_NAME=MOUAT)));Password=password;User Id=username;

    然后你得到真正的错误:

    And got ‘ORA-06413: Connection not open.’

    这是由于“Windows 服务”路径中包含括号“(DEV)”或“(UAT)”

    回答:展开连接字符串以排除 TNS 解析,然后确保调用应用程序的路径不包含方括号 '(' 或 ')'。

    【讨论】:

    • 谢谢!这是一个真正的救命稻草。小心在 64 位服务器上安装 32 位应用程序,因为它们可能安装在 C:\Program Files (x86) 中,这会导致同样的问题。
    【解决方案2】:

    尝试将 windows 环境变量 TNS_ADMIN 设置为 tnsnames.ora 文件所在的路径并重新启动您的服务。

    【讨论】:

      【解决方案3】:

      运行进程监视器以​​查看它是否正在加载 TNSNAMES.ORA 文件。我怀疑是这样,但是您作为该用户的名称解析被破坏了。

      如果您可以使用服务帐户交互登录,请尝试使用 tnsping 以查看是否可以连接到该名称。

      Oracle 按此顺序解析文件(根据 Metalink 文章 114085.1):

      1. 当前工作目录中的 Oracle Net 文件
      2. TNS_ADMIN 定义为用户/会话环境变量
      3. TNS_ADMIN 定义为全局环境变量
      4. 在注册表中定义的 TNS_ADMIN
      5. %ORACLE_HOME%\network\admin(Oracle 默认位置)中的 Oracle Net 文件

      查看进程监视器正在读取哪些内容(如果有)。

      【讨论】:

      • crb,感谢您的出色建议。该服务现在正在查看 tnsnames.ora(在进程监视器中),但仍无法解析该服务。奇怪的是,当 rdp'ing 作为服务帐户时,它可以 tnsping sid。谢谢你帮助我,我很感激。
      • 现在我们正在讨论服务权限问题。如果您的服务勾选了“与桌面交互”,它可以工作吗?是否有部分 Oracle 堆栈仅被授予 INTERACTIVE 权限?
      【解决方案4】:

      检查服务是否可以访问注册表项,并告诉 oracle tnsnames.ora 文件所在的位置。从内存中,它是带有 TNS_NAMES 注册表字符串的 HKLM\SOFTWARE\ORACLE\Key_Client,它是保存 tnsnames.ora 文件的文件夹。您也可以在 HKCU 树中创建相同的内容。

      哎呀!现在我在工作,我可以看到字符串名称应该是 TNS_ADMIN。还可以尝试环境变量 TNS_ADMIN 并确保 HKCU 中没有任何内容。

      还注意到您需要与 tnsnames.ora 位于同一文件夹中的 sqlnet.ora 文件

      【讨论】:

      • 感谢 Martlark,我运行 regedit 作为服务帐户,它可以看到 HKLM\SOFTWARE\ORACLE\HOME0 详细信息和 HKLM\SOFTWARE\ORACLE\HOME0。所有的 ORACLE_HOME 键都指向同一个目录。
      【解决方案5】:

      首先检查您的操作系统是 32 位还是 64 位。如果是64bit的话,安装oracle express edition 64bit就不会报错,运行成功....

      访问http://behindfutureworld.weebly.com了解更多详情.....

      【讨论】:

      • 你能提供一些细节吗?
      猜你喜欢
      • 2010-09-17
      • 1970-01-01
      • 2010-11-06
      • 1970-01-01
      • 2020-05-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多