我有一個包裝C++ dll的第三方庫 - 我們稱之爲LegacyAPI
。這個包裝庫是一個帶有導入方法的靜態類,並且不是線程安全的。當從WebAPI項目運行靜態類時出現StackOverflow異常 - 從控制檯應用程序運行時工作正常
我有我自己的包裝庫,包裝這第三方包裝(以提供日誌等)。讓我們把它LegacyAPIWrapper
所以,這一切應該在Web API來使用 - 可稱之爲WebAPI
我WebAPI
控制器操作調用我的LegacyAPIWrapper
。它通過一些方法(包括對不安全的LegacyAPI
的調用),並通過StackOverflow異常失敗 - 始終使用與LegacyAPI
相同的方法。
爲了排除故障,我創建了一個控制檯應用程序 - ConsoleApp
。它調用我的LegacyAPIWrapper
的方式與WebAPI
相同 - 它的工作正常!
我已經在我的web api控制器方法上強制執行STA線程,如此處所述。 http://ryanhaugh.com/archive/2014/05/24/supporting-sta-threads-in-web-api/ 此外,包裝器方法也與STAThread屬性相對應。
我已經介紹了一些額外的錄入邏輯
this.Logger.Debug($"Apartment state: [{Thread.CurrentThread.GetApartmentState()}]. Thread ID: [{Thread.CurrentThread.ManagedThreadId}]. Thread State: [{Thread.CurrentThread.ThreadState}]");
,顯示這一權利從哪裏LegacyAPIWrapper被initiallized到它拋出的錯誤,我們consistenly相同的線程內,這爲STA,它是一個正在運行的線程。
除此之外,我還試圖調用LegacyAPIWrapper在一個單獨的AppDomain這裏
https://bitlush.com/blog/executing-code-in-a-separate-application-domain-using-c-sharp
建議,但它並沒有改變任何東西。而且,通過「任何事情」,我也意味着我們仍然處於同一個線程中(在隔離被調用之前,在隔離之前) - 所以也許我做錯了什麼?
任何提示將不勝感激。
是否有你的記錄器中可能缺少某些東西,例如連接字符串或不正確的權限發生錯誤循環並給你堆棧溢出。 – McGaz
@McGaz你好,謝謝。我認爲你的意思是包裝,而不是記錄器,對嗎?你的權限是什麼意思?在任何情況下,我使用的WebAPI和控制檯應用程序都使用完全相同的包裝,具有相同的參數等。 – Bartosz