簡體   English   中英

從WebAPI項目運行靜態類時出現StackOverflow異常-從控制台應用程序運行時運行正常

[英]StackOverflow exception when running static class from a WebAPI project - works fine when run from a console application

我有一個包裝C ++ dll的3rd party庫-我們稱它為LegacyAPI 此包裝庫是帶有導入方法的靜態類,並且不是線程安全的。

我有我自己的包裝器庫,它包裝了該第三方包裝器(以提供日志記錄等)。 我們稱之為LegacyAPIWrapper

因此,所有這些都應該在網絡api中使用-讓我們稱之為WebAPI

我的WebAPI控制器動作調用了我的LegacyAPIWrapper 它會經歷某些方法(包括對不安全的LegacyAPI調用),並因StackOverflow異常而失敗-始終使用LegacyAPI的相同方法。

為了解決這個問題,我創建了一個控制台應用程序ConsoleApp 它要求我LegacyAPIWrapper的相同的方式WebAPI那樣-和它的作品OK!

我已經在我的Web api控制器方法上實施了STA Thread,如此處所述。 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到引發錯誤的地方,我們始終位於同一線程內,它是一個STA並且它是一個正在運行的線程。

除此之外,我還嘗試了如此處建議的在單獨的AppDomain中調用LegacyAPIWrapper

https://bitlush.com/blog/executing-code-in-a-separate-application-domain-using-c-sharp

但這並沒有改變任何東西。 而且,通過“任何操作”,我還表示我們仍然在同一線程上(在調用Isolated之前,並且在Isolated內)-也許我做錯了什么?

任何提示將不勝感激。

我已經“解決”了-事實證明,這與第三方應用程序的堆棧大小要求有關。

在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工具欄上的“開始”按鈕,然后在“搜索程序和文件”中鍵入“ cmd”
  5. 右鍵單擊cmd.exe,然后選擇“以管理員身份運行”
  6. 類型:“ C:\\ Program Files(x86)\\ Microsoft Visual Studio 10.0 \\ VC \\ vcvarsall.bat”
  7. 鍵入:cd C:\\ Windows \\ SysWOW64 \\ inetsrv
  8. 類型:EDITBIN /堆棧:1048576 w3wp.exe

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM