.NET 4.5.2 MVC发布至IIS报重复oracle.manageddataaccess.client段错误求助
解决IIS中Oracle.ManagedDataAccess.Client重复段定义问题
针对.NET 4.5.2 ASP.NET MVC应用发布到IIS后报There is a duplicate 'oracle.manageddataaccess.client' section defined的问题,试试以下实操方案:
1. 用clear指令清除继承的配置冲突
.NET配置采用层级继承机制,machine.config的配置会被应用web.config继承,直接删除machine.config中的对应段会导致IIS异常,可通过以下方式处理:
在web.config的<configSections>节点内添加(版本号需与项目引用的Oracle.ManagedDataAccess一致):
<section name="oracle.manageddataaccess.client" type="OracleInternal.Common.ODPMSectionHandler, Oracle.ManagedDataAccess, Version=4.122.19.1, Culture=neutral, PublicKeyToken=89b483f429c47342" />
随后在<oracle.manageddataaccess.client>节点开头加入<clear />指令,覆盖继承的配置:
<oracle.manageddataaccess.client> <clear /> <version number="*"> <dataSources> <!-- 替换为你的数据源配置 --> <dataSource alias="YourDB" descriptor="(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=db-host)(PORT=1521))(CONNECT_DATA=(SERVICE_NAME=ORCL)))" /> </dataSources> </version> </oracle.manageddataaccess.client>
2. 强制绑定应用专属的Oracle程序集版本
服务器全局安装的Oracle客户端可能与应用配置冲突,在web.config的<runtime>节点添加绑定重定向,强制使用应用bin目录内的程序集版本,并禁用发布者策略:
<runtime> <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1"> <dependentAssembly> <publisherPolicy apply="no" /> <assemblyIdentity name="Oracle.ManagedDataAccess" publicKeyToken="89b483f429c47342" culture="neutral" /> <bindingRedirect oldVersion="4.121.0.0-4.122.99.99" newVersion="4.122.19.1" /> </dependentAssembly> </assemblyBinding> </runtime>
注意newVersion需与项目引用的Oracle.ManagedDataAccess版本完全匹配。
3. 检查应用程序池的关键设置
- 确认应用程序池的.NET版本设为
v4.0(对应.NET4.5.2),64位服务器需禁用32位应用程序,避免32/64位程序集冲突; - 开启应用程序池的“加载用户配置文件”选项,未开启可能导致配置加载异常。
4. 清理服务器上的重复Oracle程序集
服务器多路径可能存在不同版本的Oracle.ManagedDataAccess.dll,引发加载混乱:
- 删除
C:\Windows\Microsoft.NET\assembly\GAC_MSIL\Oracle.ManagedDataAccess中与应用版本不一致的文件夹; - 清空
C:\Windows\Microsoft.NET\Framework64\v4.0.30319\Temporary ASP.NET Files下对应应用的临时文件; - 确保应用bin目录仅保留项目引用的目标版本
Oracle.ManagedDataAccess.dll。
5. 绕过XML配置,用代码动态配置
若以上方案均无效,可直接在代码中动态配置Oracle连接,完全规避XML配置冲突:
在Global.asax的Application_Start方法中添加:
using Oracle.ManagedDataAccess.Client; protected void Application_Start() { // 清空已有数据源配置 OracleConfiguration.DataSources.Clear(); // 添加自定义数据库连接配置 OracleConfiguration.DataSources.Add("YourDB", "(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=db-host)(PORT=1521))(CONNECT_DATA=(SERVICE_NAME=ORCL)))"); // 按需设置连接超时等参数 OracleConfiguration.ConnectionTimeout = 60; }
内容的提问来源于stack exchange,提问作者tahasozgen
相关产品推荐
相关产品推荐

