c # — исключение StackOverflow при запуске статического класса из проекта WebAPI — отлично работает при запуске из консольного приложения

У меня есть сторонняя библиотека, которая обертывает C ++ DLL — давайте назовем это LegacyAPI, Эта библиотека-оболочка является статическим классом с импортированными методами и не является поточно-ориентированной.

У меня есть собственная библиотека-оболочка, которая обернута вокруг этой сторонней оболочки (для ведения журналов и т. Д.). Давайте назовем это LegacyAPIWrapper

Итак, все это предполагается использовать в веб-API — давайте назовем это WebAPI

мой WebAPI действие контроллера вызывает мой LegacyAPIWrapper, Он проходит через некоторые методы (в том числе вызовы небезопасных LegacyAPI) и завершается с исключением StackOverflow — всегда с одним и тем же методом из LegacyAPI,

Чтобы устранить это, я создал консольное приложение — ConsoleApp, Это называет мой LegacyAPIWrapper так же, как WebAPI делает — и это работает хорошо!

Я ввел в действие STA-поток в моих методах контроллера веб-API, как описано здесь.
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 и что это запущенный поток.

Кроме того, я также попытался вызвать LegacyAPIWrapper в отдельном домене приложений, как предлагается здесь

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

Но это ничего не изменило. И, говоря «что-нибудь», я также имею в виду, что мы все еще находимся в одной и той же цепочке (до того, как Изолированный вызван и внутри Изолированного) — так что, возможно, я делаю что-то не так?

Любая подсказка будет оценена.

0

Решение

Я «решил» это — оказалось, что это вопрос размера стека стороннего приложения.

При размещении в процессе w3wp доступный стек был слишком мал — именно поэтому он работал, когда размещался как консольное приложение.

Размер стека w3wp.exe составляет 256 КБ (до 2003 года он составлял 1 МБ)

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 / STACK: 1048576 w3wp.exe
0

Другие решения

Других решений пока нет …