本地 IIS 上的 Oracle ORA-12154 错误,但 Visual Studio 开发服务器上没有

Posted

技术标签:

【中文标题】本地 IIS 上的 Oracle ORA-12154 错误,但 Visual Studio 开发服务器上没有【英文标题】:Oracle ORA-12154 error on local IIS, but not with Visual Studio Development Server 【发布时间】:2011-11-02 19:48:13 【问题描述】:

我有一个 ASP.NET 应用程序,当它由 Visual Studio 开发服务器启动时,它可以连接到 Oracle,但是当我将它部署到我的本地 IIS 时,它没有连接,显示“ORA-12154: TNS:无法解析指定的连接标识符”错误。

我的连接字符串是:

Data Source=ABC; User Id=USER; Password=PASSWORD;

Tt 正在使用 TNS。我的 tnsnames.ora 位于 C:\oracle\instantclient_10_2\network\admin,而我的 ORACLE_HOME 系统变量指向 C:\oracle\instantclient_10_2。

为了使它工作,我将连接字符串更改为:

"SERVER=(DESCRIPTION =(ADDRESS_LIST =(ADDRESS = (PROTOCOL = TCP)(HOST = server1.theplaceiwork.com)(PORT = 1521))(ADDRESS = (PROTOCOL = TCP)(HOST = server2.theplaceiwork.com)(PORT = 1521))(LOAD_BALANCE = yes))(CONNECT_DATA =(SERVER = DEDICATED)(SERVICE_NAME = ABC)(FAILOVER_MODE =(TYPE = SELECT)(METHOD = BASIC))));uid=USER;pwd=PASSWORD;"

所以不再使用 TNS。

但我想知道为什么我可以在使用 Visual Studio 进行调试时使用 TNS 进行连接,但使用 IIS 时却不能。

有什么建议吗?

PS。我可以将 SqlDeveloper 与 TNS 一起使用,显示没有连接错误。

谢谢

【问题讨论】:

IIS 是否与 VS 位于同一台机器上? 对,是开发机(Win2003)。 【参考方案1】:

确保网络服务可以访问您的 TNS 目录或更改您的应用程序池以按照您的身份运行。

【讨论】:

是的,我授予了对 C:\oracle\instantclient_10_2 目录的访问权限,并且成功了!谢谢! 如何查看网络服务是否可以访问TNS目录? 我的应用程序池使用 ApplicationPoolIdentity 运行,并且我已授予网络服务访问 TNS 目录。我仍然遇到同样的问题。请帮忙 就我而言,我使用 Windows 7、IIS 7、Visual Studio 2010,我安装了 2 个 oracle 客户端 10.2 和 11.2(我在两个不同的路径中有 2 个 TNSNNAMES.ORA)。当我使用 F5 时,Visual Studio 使用 1 个 TNSNAME,当我使用 IIS 时它使用其他 ORA !!,最后我将路径完全访问权限授予所有人帐户用户,并在 IIS 中的 AppPool 中设置 AppPoolIdentity,并且它可以工作!。跨度> 我将应用程序池从 ApplicationPoolIdentity 更改为使用网络服务,并授予 Oracle 安装目录上网络服务的权限。这行得通。【参考方案2】:

在这里找到答案:

Granting access to IIS 7.5 ApplicationPoolIdentity

在 IIS 7.5 中使用“ApplicationPoolIdentity”时,相应的 用户是(虚拟系统用户):

IIS AppPool\<AppPoolName>

您可以授予此用户权限并通过以下方式检查安全设置 正在搜索该用户。在此处查看完整说明:

http://www.iis.net/learn/manage/configuring-security/application-pool-identities

所以基本上只是将 Oracle 文件夹的权限授予 App Pool 虚拟用户。

【讨论】:

是否有包含所有应用程序池的组?否则我每次添加池时都需要授予权限。 如果您想授予所有应用程序池的权限,您可以将 de IUSR 虚拟系统用户包含到 ORA_HOMENAME_SVCSIDS 本地组中【参考方案3】:

区别在于:

当您在 Visual Studio 中进行调试时,您处于登录用户(您)的安全范围内 当您在 IIS 中运行时,您处于应用程序池标识的安全上下文中。默认为网络服务。

【讨论】:

【参考方案4】:

就我而言,我使用的是 Windows 7、IIS 7、Visual Studio 2010。出于某种原因,我安装了 2 个 Oracle 客户端、10.2 和 11.2(我在两个不同的路径中有 2 个 TNSNAMES.ORA )。当我使用 F5 时,Visual Studio 使用一个 TNSNAME,而当我使用 IIS 时,它使用另一个 TNSNAME!

如果我使用 CMD 并编写:

tnsping ORCL

它给了我我使用的 Oracle 版本:10.2 而不是 11.2。 我尝试关闭 Windows 防火墙但不起作用。 我尝试使用我的 Windows 帐户登录 IIS->AppPool,但要么无法正常工作。

终于修复(在阅读了 *** 和其他方面的大量解决方案 2 天后):

我向所有人帐户用户授予对路径 C:\oracle\productC:\app\user\product 的读取权限,因为我没有找到网络服务帐户。

在 IIS -> AppPool 中,我将 ApplicationPoolIdentity 设置为我的池。

在 IIS 中,我回收 AppPool 并重新启动我的网站。

它有效!

【讨论】:

【参考方案5】:

我已将我的应用程序池配置为在 @Jaanus 描述的 ApplicationPoolIdentity 的上下文中运行。

虚拟帐户“IIS AppPool\MyAppPoolName”已被授予对 Oracle 文件夹的读取和执行权限,但是权限并未从该文件夹继承。我必须遍历 Oracle 文件夹结构以查看权限继承在何处停止并从该点显式启用它。

我使用来自 SysInternals / Microsoft 的 Process Monitor 发现了问题:

    开始捕获 运行访问 Oracle 资源的代码并等待 Visual Studio 引发异常。 停止捕获。 筛选字符串“ACCESS DENIED”的结果字段。

【讨论】:

【参考方案6】:

发布我的案例,因为它花了很长时间才弄清楚。

我无权调整文件夹权限,设置应用程序池标识什么也没做。

最终不得不将单个站点的匿名身份验证凭据编辑为我自己的,并将应用程序池编辑为网络服务。希望有一天这会对处于同样令人沮丧的情况的人有所帮助。

【讨论】:

【参考方案7】:

如果您使用的是 ApplicationPoolIdentity,请确保 ApplicationPoolIdentity 可以访问您的 TNS 目录。

在这里查看如何授权: IIS7 Permissions Overview - ApplicationPoolIdentity

【讨论】:

【参考方案8】:

我遇到了这个问题并尝试了上面的所有方法,但没有成功。因此,再发布一件被忽视的可能是原因的事情。您的 sqlnet.ora 文件(与 tnsnames.ora 相同的目录)必须存在并且正确配置了 TNS:

#SQLNET.AUTHENTICATION_SERVICES = (NTS)
NAMES.DIRECTORY_PATH = (EZCONNECT,TNSNAMES)

EZCONNECT 是可选的,但在某些情况下非常有用,因此我将其包含在内。

正是这最后一件事使我的应用程序能够正常工作。希望这会有所帮助。

【讨论】:

以上是关于本地 IIS 上的 Oracle ORA-12154 错误,但 Visual Studio 开发服务器上没有的主要内容,如果未能解决你的问题,请参考以下文章

本地 IIS 站点上的 Chrome 速度慢

如何使用 localDB 将 ASP.NET MVC 4 应用程序部署到 Windows 7 上的本地 IIS?

如何使用托管在本地 IIS 上的 Web 应用从 Azure 密钥保管库访问 web.config 中的应用设置和连接字符串等机密

从 IIS 上的 LocalComputer 存储“Store_1”获取证书

IIS无法访问oracle数据库

再次解决 尝试加载 Oracle 客户端库时引发 BadImageFormatException