本地 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\product 和 C:\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 开发服务器上没有的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 localDB 将 ASP.NET MVC 4 应用程序部署到 Windows 7 上的本地 IIS?
如何使用托管在本地 IIS 上的 Web 应用从 Azure 密钥保管库访问 web.config 中的应用设置和连接字符串等机密