从 WebAPI 项目运行静态类时出现 StackOverflow 异常 - 从控制台应用程序运行时工作正常

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

本文关键字:控制台 应用程序 运行时 工作 异常 StackOverflow 项目 WebAPI 运行 静态类      更新时间:2023-10-16

我有一个包装C++ dll 的第三方库 - 我们称之为LegacyAPI.此包装库是具有导入方法的静态类,不是线程安全的。

我有自己的包装器库,它环绕着这个第三方包装器(提供日志记录等)。我们称之为LegacyAPIWrapper

所以,这一切都应该在 Web API 中使用 - 让我们称之为WebAPI

我的WebAPI控制器操作调用我的LegacyAPIWrapper。它通过一些方法(包括对那个不安全LegacyAPI的调用),并因 StackOverflow 异常而失败 - 始终与LegacyAPI相同的方法。

为了解决这个问题,我创建了一个控制台应用程序 -ConsoleApp.它以与WebAPI相同的方式调用我的LegacyAPIWrapper- 并且工作正常!

我已经在我的 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 初始化到它抛出错误的地方,我们始终在同一个线程中,它是一个 STA,它是一个正在运行的线程。

除此之外,我还尝试在单独的AppDomain中调用LegacyAPIWrapper,如此处建议的那样

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

但它并没有改变任何东西。而且,通过"任何东西",我也意味着我们仍然在同一线程上(在隔离之前和隔离内)——所以也许我做错了什么?

任何提示将不胜感激。

我已经"解决"了它 - 事实证明,这是第三方应用程序的堆栈大小要求的问题。

当托管在 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. "
  4. 授予 [管理员用户] 对 w3wp 的完全权限.exe
  5. 按 Windows 工具栏上的"开始"按钮,然后在"搜索程序和文件"中键入"cmd">
  6. 右键单击cmd.exe然后选择"以管理员身份运行">
  7. 类型:"C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\vcvarsall.bat"
  8. 类型: cd C:\Windows\SysWOW64\inetsrv
  9. 类型:编辑箱/堆栈:1048576 w3wp.exe