2017-09-27 87 views
0

我正在使用Oracle客户端11.2.0.4.22构建我的C#ASP.Net应用程序。 当我在本地运行它时,一切正常,但当我在测试Web服务器中运行时,它会抛出带有空异常消息的OracleException。oracle异常空消息

我发现导致空异常消息的原因之一是dataaccess.dll不能正确加载依赖库。

这里是我做的,但仍然没有成功:

  1. 确保Oracle版本在本地和测试Web服务器是相同的。
  2. 将目标平台指定为x86项目属性并使用x86 dataaccess.dll。
  3. 尝试通过在web-config中指定TraceFileName来获取Oracle的完整跟踪,但看起来像IIS服务器没有写权限。

正如下面是个例外:

{ 
    "Message": "An error has occurred.", 
    "ExceptionMessage": "", 
    "ExceptionType": "Oracle.DataAccess.Client.OracleException", 
    "StackTrace": " at Oracle.DataAccess.Client.OracleException.HandleErrorHelper(Int32 errCode, OracleConnection conn, IntPtr opsErrCtx, OpoSqlValCtx* pOpoSqlValCtx, Object src, String procedure, Boolean bCheck) 
        at Oracle.DataAccess.Client.OracleException.HandleError(Int32 errCode, OracleConnection conn, IntPtr opsErrCtx, Object src) 
        at Oracle.DataAccess.Client.OracleConnection.Open()\r\n at E3.WebServices.Repositry.OracleE3FDRepository.CheckConnection() in C:\\Users\\lokingwei\\Source\\Repos\\SRV-E3Server - 4.5.2\\E3.WebServices\\E3.WebServices\\Repositry\\OracleE3FDRepository.cs:line 34 
        at E3.WebServices.Controllers.OCAPHistController.GetConnectionCheck(String Env, String Site) in C:\\Users\\lokingwei\\Source\\Repos\\SRV-E3Server - 4.5.2\\E3.WebServices\\E3.WebServices\\Controllers\\OCAPHistController.cs:line 46 
        at lambda_method(Closure , Object , Object[])\r\n at System.Web.Http.Controllers.ReflectedHttpActionDescriptor.ActionExecutor.<>c__DisplayClass10.<GetExecutor>b__9(Object instance, Object[] methodParameters) 
        at System.Web.Http.Controllers.ReflectedHttpActionDescriptor.ActionExecutor.Execute(Object instance, Object[] arguments) 
        at System.Web.Http.Controllers.ReflectedHttpActionDescriptor.ExecuteAsync(HttpControllerContext controllerContext, IDictionary`2 arguments, CancellationToken cancellationToken) 
        --- End of stack trace from previous location where exception was thrown --- 
        at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) 
        at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) 
        at System.Web.Http.Controllers.ApiControllerActionInvoker.<InvokeActionAsyncCore>d__0.MoveNext() 
        --- End of stack trace from previous location where exception was thrown --- 
        at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) 
        at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) 
        at System.Web.Http.Controllers.ActionFilterResult.<ExecuteAsync>d__2.MoveNext() 
        --- End of stack trace from previous location where exception was thrown --- 
        at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) 
        at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) 
        at System.Web.Http.Dispatcher.HttpControllerDispatcher.<SendAsync>d__1.MoveNext()" 
} 

我的问题是:

  1. 是否有其他原因抛出空异常?
  2. 在堆栈跟踪上,它实际上是指定我本地PC上的路径,可能是IIS路径问题吗?因为它也不能写入跟踪文件。
+0

*“请确保本地和测试Web服务器上的Oracle版本是相同的。”* - 确保在服务器GAC中注册的oracle.dataaccess.dll是相同的... x86? - 这取决于您的池和编译,而且在这种情况下,Ora Client也必须是x86。 *“IIS服务器没有写权限”。* - 因此,正确配置您的应用程序池标识 –

+0

Oracle版本相同,GAC中的dll相同,.Net应用程序已经设置为x86中构建... I尝试在IIS上工作 –

回答

0

的根本原因是由于IIS用户帐户没有读取朝向Ç权限:/ Oracle目录。

通过向IIS用户帐户提供读取权限解决。

0

我们之前遇到过这个,看起来加载时出现问题Oracle.DataAccess.dll。对我们来说有效的是,我们从项目引用中删除了Oracle.DataAccess.dll,并将dll复制到项目文件夹,然后使用复制的文件将引用重新添加到dll。

加回参考值后,进行以下设置:

Copy Local: True 
Embed Interop Services: False 
Specific Version: False 
+0

编译期间,DLL驻留在哪里并不重要。如果Ora客户端正确地安装在服务器上,该DLL将在GAC中注册 –

+0

同意...我尝试一切来更改Oracle.dataaccess.dll位置...移动到Oracle Xcopy是否好? –