項目介紹:為前台網站提供rest接口來操作erp相關數據
涉及db:oracle11
技術方案:因為erp是用remoting來調用,我想rest實現部分調用remoting來操作減少耦合,當然性能上損失點。
可惜架構師要求直接引用dll來調用
言歸正傳,當初erp是用32位oracle客戶端而我們機器都是裝64位系統,所以編譯時候必須用x86來,不然啟動會報"未能加載文件或程序集“Oracle.DataAccess”或它的某一個依賴項。試圖加載格式不正確的程序。" ,后來在我的建議下換成64位客戶端用anycpu編譯就可以了。
rest服務調用erp的接口需要引用Oracle.DataAccess.dll版本為4.112.3.0,先用iishost服務來測試調用,wcf測試客戶端一直報錯
錯誤: 無法從 http://localhost:8733/MallAPI/SaleOrderService.svc 獲取元數據如果是您有權訪問的 Windows (R) Communication Foundation 服務,請檢查是否已啟用在指定地址發布元數據。有關啟用元數據發布的幫助,請參閱 http://go.microsoft.com/fwlink/?LinkId=65455 上的 MSDN 文檔。WS-Metadata Exchange 錯誤 URI: http://localhost:8733/MallAPI/SaleOrderService.svc 元數據包含無法解析的引用:“http://localhost:8733/MallAPI/SaleOrderService.svc”。 接收對 http://localhost:8733/MallAPI/SaleOrderService.svc 的 HTTP 響應時發生錯誤。這可能是由於服務終結點綁定未使用 HTTP 協議造成的。這還可能是由於服務器中止了 HTTP 請求上下文(可能由於服務關閉)所致。有關詳細信息,請參見服務器日志。 基礎連接已經關閉: 接收時發生錯誤。 無法從傳輸連接中讀取數據: 遠程主機強迫關閉了一個現有的連接。。 遠程主機強迫關閉了一個現有的連接。HTTP GET Error URI: http://localhost:8733/MallAPI/SaleOrderService.svc 下載“http://localhost:8733/MallAPI/SaleOrderService.svc”時出錯。 請求失敗,錯誤信息為:--<!DOCTYPE html><html> <head> <title>未能加載文件或程序集“Oracle.DataAccess”或它的某一個依賴項。試圖加載格式不正確的程序。</title> <meta name="viewport" content="width=device-width" /> <style> body {font-family:"Verdana";font-weight:normal;font-size: .7em;color:black;} p {font-family:"Verdana";font-weight:normal;color:black;margin-top: -5px} b {font-family:"Verdana";font-weight:bold;color:black;margin-top: -5px} H1 { font-family:"Verdana";font-weight:normal;font-size:18pt;color:red } H2 { font-family:"Verdana";font-weight:normal;font-size:14pt;color:maroon } pre {font-family:"Consolas","Lucida Console",Monospace;font-size:11pt;margin:0;padding:0.5em;line-height:14pt} .marker {font-weight: bold; color: black;text-decoration: none;} .version {color: gray;} .error {margin-bottom: 10px;} .expandable { text-decoration:underline; font-weight:bold; color:navy; cursor:hand; } @media screen and (max-width: 639px) { pre { width: 440px; overflow: auto; white-space: pre-wrap; word-wrap: break-word; } } @media screen and (max-width: 479px) { pre { width: 280px; } } </style> </head> <body bgcolor="white"> <span><H1>“/MallAPI”應用程序中的服務器錯誤。<hr width=100% size=1 color=silver></H1> <h2> <i>未能加載文件或程序集“Oracle.DataAccess”或它的某一個依賴項。試圖加載格式不正確的程序。</i> </h2></span> <font face="Arial, Helvetica, Geneva, SunSans-Regular, sans-serif "> <b> 說明: </b>執行當前 Web 請求期間,出現未經處理的異常。請檢查堆棧跟蹤信息,以了解有關該錯誤以及代碼中導致錯誤的出處的詳細信息。 <br><br> <b> 異常詳細信息: </b>System.BadImageFormatException: 未能加載文件或程序集“Oracle.DataAccess”或它的某一個依賴項。試圖加載格式不正確的程序。<br><br> <b>源錯誤:</b> <br><br> <table width=100% bgcolor="#ffffcc"> <tr> <td> <code>執行當前 Web 請求期間生成了未經處理的異常。可以使用下面的異常堆棧跟蹤信息確定有關異常原因和發生位置的信息。</code> </td> </tr> </table> <br> <b>程序集加載跟蹤:</b> 下列信息有助於確定程序集“Oracle.DataAccess”未能加載的原因。<br><br> <table width=100% bgcolor="#ffffcc"> <tr> <td> <code><pre>=== 預綁定狀態信息 ===日志: 用戶 = huangjun\hj日志: DisplayName = Oracle.DataAccess (Partial)警告: 為程序集提供了部分綁定信息:警告: 程序集名稱: Oracle.DataAccess | 域 ID: 4警告: 當僅提供程序集顯示名稱的一部分時,將發生部分綁定。警告: 這可能導致聯編程序加載錯誤的程序集。警告: 建議為程序集提供完全指定的文字標識,警告: 並由簡單名稱、版本、區域性和公鑰標記組成。警告: 有關此問題的詳細信息和常見解決方案,請參見白皮書 http://go.microsoft.com/fwlink/?LinkId=109270。日志: Appbase = file:///F:/work/SourceCode/MallAPI/IISHost/日志: 初始 PrivatePath = F:\work\SourceCode\MallAPI\IISHost\bin調用程序集: (Unknown)。===日志: 此綁定從 default 加載上下文開始。日志: 正在使用應用程序配置文件: F:\work\SourceCode\MallAPI\IISHost\web.config日志: 使用主機配置文件: 日志: 使用 C:\Windows\Microsoft.NET\Framework\v4.0.30319\config\machine.config 的計算機配置文件。日志: 此時沒有為引用應用策略(私有、自定義、分部或基於位置的程序集綁定)。日志: 嘗試下載新的 URL file:///C:/Users/hj/AppData/Local/Temp/Temporary ASP.NET Files/mallapi/b831d71b/68b495b/Oracle.DataAccess.DLL。日志: 嘗試下載新的 URL file:///C:/Users/hj/AppData/Local/Temp/Temporary ASP.NET Files/mallapi/b831d71b/68b495b/Oracle.DataAccess/Oracle.DataAccess.DLL。日志: 嘗試下載新的 URL file:///F:/work/SourceCode/MallAPI/IISHost/bin/Oracle.DataAccess.DLL。錯誤: 未能完成程序集的安裝(hr = 0x8007000b)。探測終止。</pre></code> </td> </tr> </table> <br> <b>堆棧跟蹤:</b> <br><br> <table width=100% bgcolor="#ffffcc"> <tr> <td> <code><pre>[BadImageFormatException: 未能加載文件或程序集“Oracle.DataAccess”或它的某一個依賴項。試圖加載格式不正確的程序。] System.Reflection.RuntimeAssembly._nLoad(AssemblyName fileName, String codeBase, Evidence assemblySecurity, RuntimeAssembly locationHint, StackCrawlMark& stackMark, IntPtr pPrivHostBinder, Boolean throwOnFileNotFound, Boolean forIntrospection, Boolean suppressSecurityChecks) +0 System.Reflection.RuntimeAssembly.nLoad(AssemblyName fileName, String codeBase, Evidence assemblySecurity, RuntimeAssembly locationHint, StackCrawlMark& stackMark, IntPtr pPrivHostBinder, Boolean throwOnFileNotFound, Boolean forIntrospection, Boolean suppressSecurityChecks) +34 System.Reflection.RuntimeAssembly.InternalLoadAssemblyName(AssemblyName assemblyRef, Evidence assemblySecurity, RuntimeAssembly reqAssembly, StackCrawlMark& stackMark, IntPtr pPrivHostBinder, Boolean throwOnFileNotFound, Boolean forIntrospection, Boolean suppressSecurityChecks) +152 System.Reflection.RuntimeAssembly.InternalLoad(String assemblyString, Evidence assemblySecurity, StackCrawlMark& stackMark, IntPtr pPrivHostBinder, Boolean forIntrospection) +77 System.Reflection.RuntimeAssembly.InternalLoad(String assemblyString, Evidence assemblySecurity, StackCrawlMark& stackMark, Boolean forIntrospection) +16 System.Reflection.Assembly.Load(String assemblyString) +28 System.Web.Configuration.CompilationSection.LoadAssemblyHelper(String assemblyName, Boolean starDirective) +38[ConfigurationErrorsException: 未能加載文件或程序集“Oracle.DataAccess”或它的某一個依賴項。試圖加載格式不正確的程序。] System.Web.Configuration.CompilationSection.LoadAssemblyHelper(String assemblyName, Boolean starDirective) +752 System.Web.Configuration.CompilationSection.LoadAllAssembliesFromAppDomainBinDirectory() +218 System.Web.Configuration.CompilationSection.LoadAssembly(AssemblyInfo ai) +130 System.Web.Compilation.BuildManager.GetReferencedAssemblies(CompilationSection compConfig) +170 System.Web.Compilation.BuildManager.GetPreStartInitMethodsFromReferencedAssemblies() +91 System.Web.Compilation.BuildManager.CallPreStartInitMethods(String preStartInitListPath) +258 System.Web.Compilation.BuildManager.ExecutePreAppStart() +135 System.Web.Hosting.HostingEnvironment.Initialize(ApplicationManager appManager, IApplicationHost appHost, IConfigMapPathFactory configMapPathFactory, HostingEnvironmentParameters hostingParameters, PolicyLevel policyLevel, Exception appDomainCreationException) +516[HttpException (0x80004005): 未能加載文件或程序集“Oracle.DataAccess”或它的某一個依賴項。試圖加載格式不正確的程序。] System.Web.HttpRuntime.FirstRequestInit(HttpContext context) +9874568 System.Web.HttpRuntime.EnsureFirstRequestInit(HttpContext context) +101 System.Web.HttpRuntime.ProcessRequestInternal(HttpWorkerRequest wr) +456</pre></code> </td> </tr> </table> <br> <hr width=100% size=1 color=silver> <b>版本信息:</b>?Microsoft .NET Framework 版本:4.0.30319; ASP.NET 版本:4.0.30319.18045 </font> </body></html><!-- [BadImageFormatException]: 未能加載文件或程序集“Oracle.DataAccess”或它的某一個依賴項。試圖加載格式不正確的程序。 在 System.Reflection.RuntimeAssembly._nLoad(AssemblyName fileName, String codeBase, Evidence assemblySecurity, RuntimeAssembly locationHint, StackCrawlMark& stackMark, IntPtr pPrivHostBinder, Boolean throwOnFileNotFound, Boolean forIntrospection, Boolean suppressSecurityChecks) 在 System.Reflection.RuntimeAssembly.nLoad(AssemblyName fileName, String codeBase, Evidence assemblySecurity, RuntimeAssembly locationHint, StackCrawlMark& stackMark, IntPtr pPrivHostBinder, Boolean throwOnFileNotFound, Boolean forIntrospection, Boolean suppressSecurityChecks) 在 System.Reflection.RuntimeAssembly.InternalLoadAssemblyName(AssemblyName assemblyRef, Evidence assemblySecurity, RuntimeAssembly reqAssembly, StackCrawlMark& stackMark, IntPtr pPrivHostBinder, Boolean throwOnFileNotFound, Boolean forIntrospection, Boolean suppressSecurityChecks) 在 System.Reflection.RuntimeAssembly.InternalLoad(String assemblyString, Evidence assemblySecurity, StackCrawlMark& stackMark, IntPtr pPrivHostBinder, Boolean forIntrospection) 在 System.Reflection.RuntimeAssembly.InternalLoad(String assemblyString, Evidence assemblySecurity, StackCrawlMark& stackMark, Boolean forIntrospection) 在 System.Reflection.Assembly.Load(String assemblyString) 在 System.Web.Configuration.CompilationSection.LoadAssemblyHelper(String assemblyName, Boolean starDirective)[ConfigurationErrorsException]: 未能加載文件或程序集“Oracle.DataAccess”或它的某一個依賴項。試圖加載格式不正確的程序。 在 System.Web.Configuration.CompilationSection.LoadAssemblyHelper(String assemblyName, Boolean starDirective) 在 System.Web.Configuration.CompilationSection.LoadAllAssembliesFromAppDomainBinDirectory() 在 System.Web.Configuration.CompilationSection.LoadAssembly(AssemblyInfo ai) 在 System.Web.Compilation.BuildManager.GetReferencedAssemblies(CompilationSection compConfig) 在 System.Web.Compilation.BuildManager.GetPreStartInitMethodsFromReferencedAssemblies() 在 System.Web.Compilation.BuildManager.CallPreStartInitMethods(String preStartInitListPath) 在 System.Web.Compilation.BuildManager.ExecutePreAppStart() 在 System.Web.Hosting.HostingEnvironment.Initialize(ApplicationManager appManager, IApplicationHost appHost, IConfigMapPathFactory configMapPathFactory, HostingEnvironmentParameters hostingParameters, PolicyLevel policyLevel, Exception appDomainCreationException)[HttpException]: 未能加載文件或程序集“Oracle.DataAccess”或它的某一個依賴項。試圖加載格式不正確的程序。 在 System.Web.HttpRuntime.FirstRequestInit(HttpContext context) 在 System.Web.HttpRuntime.EnsureFirstRequestInit(HttpContext context) 在 System.Web.HttpRuntime.ProcessRequestInternal(HttpWorkerRequest wr)-->--.
然后我試了selfhost是ok的,我對測試客戶端還不死心網上查資料,解決方案以anycpu、mixed platforms、x64編譯生成都不行,來回折騰了2天,最后試了用iis來host結果是ok的,看樣子wcf測試客戶端默認是32位編譯,當然我沒有考證過,如果有哪位知道的同學麻煩告訴一下,這里先謝謝啦
結論:系統64、oracle client64如果用wcf測試客戶端報錯就用iis host
