【问题标题】:Deploying ASP.NET website with ODP.NET使用 ODP.NET 部署 ASP.NET 网站
【发布时间】:2014-09-05 08:29:54
【问题描述】:

我在回答了更多类似的问题后写了这篇文章:

OracleException (0x80004005) When Connecting to Oracle Database

The provider is not compatible with the version of Oracle client

我有一个小型 ASP.NET 网站,它在开发人员机器上运行良好,但在测试服务器中无法正常运行。当应用程序调用 OracleConnection.Open();我得到一个相当无助的“未处理的执行错误”。完整说明如下:

在我的机器(开发者机器)上它运行良好,但在测试服务器上运行不佳。

我的规格

开发机器和测试服务器:Win 7、IIS7、Oracle Instant Client 11.2.0.4、.NET Framework 4.0 UAT 和生产数据库:Oracle 9i 标准版 我在 Bin 文件夹中有 DLL

我的目标

不要在部署机器中安装 Oracle 客户端,而只是复制 DLL。

我尝试过的:

  • 我已经安装了最新的 Microsoft Visual C++ 2012 Redistributable (x86)

  • 将Platform Target的项目设置设置为x86

  • 确定是否是 IIS 问题,我制作了一个简单的 C# Winforms 应用程序及其 EXE,我已复制所有 DLL。我在调用 OracleConnection.Open() 时运行了它,引发了异常并且它的一些属性为空。

在我的 C# Winform 应用程序中,我编写了以下代码:

private void btnConnect_Click(object sender, EventArgs e)
        {

            string conStr = string.Format(oraConStr, txtHost.Text, txtPwd.Text, txtUser.Text);
            using (OracleConnection con = new OracleConnection(conStr))
            {
                LogMessage(conStr);
                try
                {
                    con.Open();
                    MessageBox.Show("Connected");
                }
                catch (OracleException OraEr)
                {
                    displayOracleErrorMessage(OraEr);
                }
                catch (Exception Er)
                {
                    MessageBox.Show(Er.Message);
                }
            }


        }

        private void displayOracleErrorMessage(OracleException er)
        {
            MessageBox.Show(string.Format("Error {0}\nError Number {1}\nStack Trace{1}", er.Message, er.Number, er.StackTrace));
        }

当我运行上述应用程序时,发生异常,但异常在其错误消息、错误编号和错误源的属性中具有空值,因此我得到“对象引用未设置为类的实例“ 错误。即Oracle.DataAccess.Client.OracleException.get_Number()

有关调用的详细信息,请参阅此消息的末尾 即时 (JIT) 调试,而不是此对话框。

************** Exception Text **************
System.NullReferenceException: Object reference not set to an instance of an object.
   at Oracle.DataAccess.Client.OracleException.get_Number()
   at OracleConnectionChecker.Form1.displayOracleErrorMessage(OracleException er) in d:\TEMP\Test 2013\Projects\OracleConnectionChecker\OracleConnectionChecker\Form1.cs:line 54
   at OracleConnectionChecker.Form1.btnConnect_Click(Object sender, EventArgs e) in d:\TEMP\Test 2013\Projects\OracleConnectionChecker\OracleConnectionChecker\Form1.cs:line 41
   at System.Windows.Forms.Control.OnClick(EventArgs e)
   at System.Windows.Forms.Button.OnClick(EventArgs e)
   at System.Windows.Forms.Button.OnMouseUp(MouseEventArgs mevent)
   at System.Windows.Forms.Control.WmMouseUp(Message& m, MouseButtons button, Int32 clicks)
   at System.Windows.Forms.Control.WndProc(Message& m)
   at System.Windows.Forms.ButtonBase.WndProc(Message& m)
   at System.Windows.Forms.Button.WndProc(Message& m)
   at System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m)
   at System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m)
   at System.Windows.Forms.NativeWindow.Callback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)


************** Loaded Assemblies **************
mscorlib
    Assembly Version: 4.0.0.0
    Win32 Version: 4.0.30319.18408 built by: FX451RTMGREL
    CodeBase: file:///C:/Windows/Microsoft.NET/Framework/v4.0.30319/mscorlib.dll
----------------------------------------
OracleConnectionChecker
    Assembly Version: 1.0.0.0
    Win32 Version: 1.0.0.0
    CodeBase: file:///C:/Executable/Debug/OracleConnectionChecker.exe
----------------------------------------
System.Windows.Forms
    Assembly Version: 4.0.0.0
    Win32 Version: 4.0.30319.18408 built by: FX451RTMGREL
    CodeBase: file:///C:/Windows/Microsoft.Net/assembly/GAC_MSIL/System.Windows.Forms/v4.0_4.0.0.0__b77a5c561934e089/System.Windows.Forms.dll
----------------------------------------
System.Drawing
    Assembly Version: 4.0.0.0
    Win32 Version: 4.0.30319.18408 built by: FX451RTMGREL
    CodeBase: file:///C:/Windows/Microsoft.Net/assembly/GAC_MSIL/System.Drawing/v4.0_4.0.0.0__b03f5f7f11d50a3a/System.Drawing.dll
----------------------------------------
System
    Assembly Version: 4.0.0.0
    Win32 Version: 4.0.30319.18408 built by: FX451RTMGREL
    CodeBase: file:///C:/Windows/Microsoft.Net/assembly/GAC_MSIL/System/v4.0_4.0.0.0__b77a5c561934e089/System.dll
----------------------------------------
Oracle.DataAccess
    Assembly Version: 4.112.4.0
    Win32 Version: 4.112.4.0
    CodeBase: file:///C:/Executable/Debug/Oracle.DataAccess.DLL
----------------------------------------
System.Data
    Assembly Version: 4.0.0.0
    Win32 Version: 4.0.30319.18408 built by: FX451RTMGREL
    CodeBase: file:///C:/Windows/Microsoft.Net/assembly/GAC_32/System.Data/v4.0_4.0.0.0__b77a5c561934e089/System.Data.dll
----------------------------------------
System.Core
    Assembly Version: 4.0.0.0
    Win32 Version: 4.0.30319.18408 built by: FX451RTMGREL
    CodeBase: file:///C:/Windows/Microsoft.Net/assembly/GAC_MSIL/System.Core/v4.0_4.0.0.0__b77a5c561934e089/System.Core.dll
----------------------------------------
System.Transactions
    Assembly Version: 4.0.0.0
    Win32 Version: 4.0.30319.18408 built by: FX451RTMGREL
    CodeBase: file:///C:/Windows/Microsoft.Net/assembly/GAC_32/System.Transactions/v4.0_4.0.0.0__b77a5c561934e089/System.Transactions.dll
----------------------------------------
System.Configuration
    Assembly Version: 4.0.0.0
    Win32 Version: 4.0.30319.18408 built by: FX451RTMGREL
    CodeBase: file:///C:/Windows/Microsoft.Net/assembly/GAC_MSIL/System.Configuration/v4.0_4.0.0.0__b03f5f7f11d50a3a/System.Configuration.dll
----------------------------------------
System.Xml
    Assembly Version: 4.0.0.0
    Win32 Version: 4.0.30319.18408 built by: FX451RTMGREL
    CodeBase: file:///C:/Windows/Microsoft.Net/assembly/GAC_MSIL/System.Xml/v4.0_4.0.0.0__b77a5c561934e089/System.Xml.dll
----------------------------------------
System.EnterpriseServices
    Assembly Version: 4.0.0.0
    Win32 Version: 4.0.30319.18408 built by: FX451RTMGREL
    CodeBase: file:///C:/Windows/Microsoft.Net/assembly/GAC_32/System.EnterpriseServices/v4.0_4.0.0.0__b03f5f7f11d50a3a/System.EnterpriseServices.dll
----------------------------------------

************** JIT Debugging **************
To enable just-in-time (JIT) debugging, the .config file for this
application or computer (machine.config) must have the
jitDebugging value set in the system.windows.forms section.
The application must also be compiled with debugging
enabled.

For example:

<configuration>
    <system.windows.forms jitDebugging="true" />
</configuration>

When JIT debugging is enabled, any unhandled exception
will be sent to the JIT debugger registered on the computer
rather than be handled by this dialog box.

“/JksbBoWeb2”应用程序中的服务器错误。

未处理的执行错误描述:未处理的异常 在执行当前 Web 请求期间发生。请 查看堆栈跟踪以获取有关错误和位置的更多信息 它起源于代码。

异常详细信息:Oracle.DataAccess.Client.OracleException:

来源错误:

在执行过程中产生了一个未处理的异常 当前的网络请求。有关原产地和位置的信息 可以使用下面的异常堆栈跟踪来识别异常。

堆栈跟踪:

[OracleException (0x80004005)]
Oracle.DataAccess.Client.OracleException.HandleErrorHelper(Int32 errCode、OracleConnection conn、IntPtr opsErrCtx、OpoSqlValCtx* pOpoSqlValCtx, Object src, String procedure, Boolean bCheck) +1467
Oracle.DataAccess.Client.OracleException.HandleError(Int32 errCode, OracleConnection conn, IntPtr opsErrCtx, Object src) +24
Oracle.DataAccess.Client.OracleConnection.Open() +4444
JksbBoWeb2.Default.getMainDataSet(DateTime pStartDate, DateTime pEndDate) +296 JksbBoWeb2.Default.btnToday_Click(对象发件人, EventArgs e) +133 JksbBoWeb2.Default.Page_Load(对象发送者, 事件参数 e) +28
System.Web.Util.CalliEventHandlerDelegateProxy.Callback(对象发送者, EventArgs e) +51 System.Web.UI.Control.OnLoad(EventArgs e) +92
System.Web.UI.Control.LoadRecursive() +54
System.Web.UI.Page.ProcessRequestMain(布尔值 includeStagesBeforeAsyncPoint,布尔型 includeStagesAfterAsyncPoint) +772

----------------------------------- --------------------------------- 版本信息:Microsoft .NET Framework 版本:4.0.30319; ASP.NET 版本:4.0.30319.18408

好吧,想想我是否在我的 webconfig 中遗漏了任何内容,我正在发布相同的内容

<?xml version="1.0"?>
<!--
  For more information on how to configure your ASP.NET application, please visit
  http://go.microsoft.com/fwlink/?LinkId=169433
  -->
<configuration>
  <appSettings>
    <add key="ChartImageHandler" value="storage=file;timeout=20;dir=c:\TempImageFiles\;" />
  </appSettings>
  <system.webServer>
    <validation validateIntegratedModeConfiguration="false" />
    <handlers>
      <remove name="ChartImageHandler" />
      <add name="ChartImageHandler" preCondition="integratedMode" verb="GET,HEAD,POST"
        path="ChartImg.axd" type="System.Web.UI.DataVisualization.Charting.ChartHttpHandler, System.Web.DataVisualization, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" />
    </handlers>
  </system.webServer>
  <system.web>
    <httpHandlers>
      <add path="ChartImg.axd" verb="GET,HEAD,POST" type="System.Web.UI.DataVisualization.Charting.ChartHttpHandler, System.Web.DataVisualization, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"
        validate="false" />
    </httpHandlers>
    <pages>
      <controls>
        <add tagPrefix="asp" namespace="System.Web.UI.DataVisualization.Charting"
          assembly="System.Web.DataVisualization, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" />
      </controls>
    </pages>
    <compilation debug="true" targetFramework="4.0">
      <assemblies>
        <add assembly="System.Web.DataVisualization, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/>
      </assemblies>
    </compilation>
    <authentication mode="Forms">
      <forms loginUrl="login.aspx" name=".ASPXFORMSAUTH"/>
    </authentication>
    <authorization>
      <deny users="?"/>
    </authorization>
  </system.web>
  <connectionStrings>
    <add name="ora.prod.jksb.com" connectionString="DATA SOURCE=(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=x)(PORT=1521)))(CONNECT_DATA=(SID = ORCL)));PASSWORD=x;USER ID=x;" providerName="Oracle.DataAccess.Client"/>
    <add name="ora.uat.jksb.com" connectionString="DATA SOURCE=(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=x)(PORT=1521)))(CONNECT_DATA=(SID = ORCL)));PASSWORD=x;USER ID=x;" providerName="Oracle.DataAccess.Client"/>
  </connectionStrings>
</configuration>

【问题讨论】:

    标签: c# asp.net oracle odp.net


    【解决方案1】:

    为了简单起见:你不能。 ODP.NET (Oracle.DataAccess.Client) 使用 OCI,即来自 Oracle 的处理实际连接的库。那不是 .NET 程序集,它是用 C++ 编写的。 ODP.NET 只是调用 OCI 的包装器。这就是您必须安装客户端工具的原因。

    但还有更多。 Oracle 发布了Managed ODP.NET,它是协议的完整实现(而不仅仅是对 OCI 的封装)。这意味着您不必安装客户端工具,只需包含该单个程序集即可!

    【讨论】:

    • 谢谢!只是为了缓解混乱,首先,我不需要担心任何 32 位/64 位问题,我只需下载您在链接中提供的 64 位驱动程序即可继续?其次,我不需要担心部署服务器中的 Oracle 客户端,我只需将这个 dll 放在我项目的 bin 中并继续?我也不需要在部署服务器中安装 Oracle 客户端。
    • 托管 ODP.NET 未针对特定处理器架构进行编译,因此 32 位和 64 位之间没有区别。实际上,您不需要安装客户端工具来使托管 ODP.NET 工作。很遗憾你不能使用tnsnames.ora,所以你必须直接连接。
    【解决方案2】:

    解决了这个问题。

    我发现一个Old Oracle 9i client 已安装在部署服务器中,这会导致与Oracle 部署相关的任何dll 发生冲突。我只是卸载了 Oracle 9i 客户端,删除了 PATH 中的引用,最后删除了注册表中的 HKLM\SOFTWARE\ORACLE 键,它就起作用了!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-09-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-10-30
      • 2011-03-23
      • 2011-02-21
      相关资源
      最近更新 更多