2017-04-12 35 views
0

我有一個包裝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

建議,但它並沒有改變任何東西。而且,通過「任何事情」,我也意味着我們仍然處於同一個線程中(在隔離被調用之前,在隔離之前) - 所以也許我做錯了什麼?

任何提示將不勝感激。

+0

是否有你的記錄器中可能缺少某些東西,例如連接字符串或不正確的權限發生錯誤循環並給你堆棧溢出。 – McGaz

+0

@McGaz你好,謝謝。我認爲你的意思是包裝,而不是記錄器,對嗎?你的權限是什麼意思?在任何情況下,我使用的WebAPI和控制檯應用程序都使用完全相同的包裝,具有相同的參數等。 – Bartosz

回答

0

我已'解決'它 - 事實證明,這是第三方應用程序的堆棧大小要求的問題。

在w3wp進程上託管時,可用堆棧太小 - 這就是爲什麼當它作爲控制檯應用程序託管時它工作的原因。

w3wp.exe的堆棧大小爲256KB(它使用2003年之前要1MB)

https://blogs.msdn.microsoft.com/tom/2008/03/31/stack-sizes-in-iis-affects-asp-net/

分辨率

  1. 在文件資源管理器,瀏覽到C:\ Windows \ SysWOW64中\ inetsrv \
  2. 右鍵單擊w3wp.exe並選擇屬性>安全性>高級>所有者>編輯>更改所有者>管理員>確定>確定>確定
  3. 授予[Admin-User] w3wp的完整權限。EXE
  4. 按Windows工具欄
  5. 類型上,並在搜索程序和文件,輸入「cmd」
  6. 鼠標右鍵單擊cmd.exe,選擇「以管理員身份運行」開始按鈕:「C:\ Program Files文件(x86)的\微軟的Visual Studio 10.0 \ VC \ vcvarsall.bat」
  7. 鍵入:cd C:\ WINDOWS \ Syswow64資料\ INETSRV
  8. 類型:EDITBIN/STACK:1048576 w3wp.exe的
相關問題