从 WebAPI 项目运行静态类时出现 StackOverflow 异常 - 从控制台应用程序运行时工作正常
StackOverflow exception when running static class from a WebAPI project - works fine when run from a console application
我有一个包装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/
决议
- 在文件资源管理器中,浏览到 C:\Windows\SysWOW64\inetsrv\
- 右键单击 w3wp.exe然后选择"属性">"安全性">"高级>所有者">"编辑">"将所有者更改为>管理员">"确定">"确定">"确定 "
- 授予 [管理员用户] 对 w3wp 的完全权限.exe
- 按 Windows 工具栏上的"开始"按钮,然后在"搜索程序和文件"中键入"cmd">
- 右键单击cmd.exe然后选择"以管理员身份运行">
- 类型:"C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\vcvarsall.bat"
- 类型: cd C:\Windows\SysWOW64\inetsrv
- 类型:编辑箱/堆栈:1048576 w3wp.exe
- C++控制台应用程序阻止退出
- 如何在 Win32 C++控制台应用程序中调用 UWP 类库
- 是否可以从控制台应用程序使用 C++/WinRT 创建窗口?
- 如何创建一个使用开源c项目的c++控制台应用程序
- c ++控制台应用程序,如何在控制台外部打印字符
- 将控制台应用程序直接输出到Visual Studio而不是外部Windows控制台中
- 如何在 Win32 控制台应用程序中注册不可见的窗口类?
- 如何将从控制台应用程序C++回调设置为C++ COM DLL
- 使用代码在 AWS 开发工具包C++控制台应用程序上设置凭证
- 直接输入控制台应用程序
- C++调试控制台应用程序
- C++控制台应用程序调用C++/CLI静态库
- 如何在控制台应用程序中添加滚动功能以显示更大的输入
- 如何在将Visual Studio C++控制台应用程序连接到Microsoft SQL Server时修复"
- 如何读取windows服务启动的控制台应用程序的输出
- VS2017 中缺少 Win32 控制台应用程序.如何创建C++空项目?
- 将 Visual C++ 6 控制台应用程序作为 Windows 服务运行
- 如何将控制台应用程序放入系统托盘通知C++?
- 如何向控制台应用程序添加图标
- 如何在 Linux/Apache 虚拟主机上运行 win32 控制台应用程序?