[英]XpsDocumenWriter hangs from Windows Service, but works fine when running from console
[英]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/
分辨率
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.