Ошибка при большом количестве подписей

Добрый день!

У нас есть приложение на ASP.NET (C#), которое крутится в IIS. В самом приложении есть логика подписания документа через KalkanCryptCOM, который мы недавно обновили на сервере Windows.
Само подписание работает корректно, но когда начинают подписывать большое количество пользователей, то в один момент запускается дебаггер IIS-а, где мы можем выбрать либо debug w3wp.exe, либо закрыть окно, но после наше приложение просто перезапускается, точнее IIS перезапускает его. В логах сервера нашли только 1 более менее подходящую ошибку:

Faulting module name: ucrtbase.DLL, version: 10.0.14393.2990, time stamp: 0x5caeb96f
Exception code: 0xc0000409

В интернете нашли информацию, что это переполнение буффера

https://stackoverflow.com/questions/23409809/how-do-you-diagnose-the-exception-code-0xc0000409-on-windows
The clue to the problem is in the exception code: 0xc0000409
0xc0000409 means STATUS_STACK_BUFFER_OVERRUN.

И мы хотели бы понять, может ли быть такое, что KalkanCryptCOM.dll у нас в одном экземпляре и из за большого количества запросов на подписание он просто перегружается?
Дополнительно, у нас только 1 сервер, соответственно 1 KalanCryptCOM для подписания (без NCALayer).

Возможно, кто то уже сталкивался с такой ошибкой?

Здравствуйте! Делаете ли Вы KC_Finalize() после каждого подписания?

Добрый день!

Нет, а что он делает?
Дополнительно, мы бы хотели понять, можем ли мы подписывать в нескольких потоках, например, через Semaphore?

Добрый день!
KC_Finalize() используется в случае, если Вы заканчиваете работу с библиотекой Kalkan.
Подскажи, как именно у вас реализовано? Один раз проинициализировали библиотеку- Init(), а после при каждом подписании вызываете метод SignData()?

Сама библиотека KalkanCryptCOM не поддерживает работу в нескольких потоках. Но вы можете реализовать семафоры, но так чтобы одновременно два потока не пересекались. Обязательно дожидаться освобождения.

Но вот не пойму логику работы с библиотекой. Как называется ваша компания?

Добрый день!

Спасибо за ответ.
Мы реализовали через локеры (.NET) и поэтому все подписывается по очереди, но у нас не было вызова Finalize(), скорее всего поэтому и была ошибка

Не уверен, что Вы верно поняли меня. Напишите на почту knca@pki.gov.kz с более подробным описанием процесса подписания.

Постараюсь объяснить тут. Вы правильно указали, мы делаем следующим образом:

  1. Мы делаем 1 раз Init()
  2. Далее при каждом подписании вызываем SignData()

НУ в таком случае finalize не имеет особого значения.
Все же пришлите код на knca@pki.gov.kz и описание еще.

Я неправильно указал нашу реализацию - оказывается у нас производится Init() на каждый запрос подписания.

Также отправили на knca@pki.gov.kz пример с нашим кодом

Добрый день!

Мы изменили немного свой код связанный с Init() и Finalize().
Сейчас по логике происходит следующее:

  1. Вызов Init()
  2. Подписание файлов через SignData
  3. Finalize()

Но ошибка, которую мы описали в начале запроса все равно возникает и мы все же думаем, что проблема в том, что операций подписания очень много и возможно происходит ошибка из-за большой нагрузки, хотя количество возникновения этой ошибки уменьшилось

Добрый день!

А как много подписей производится?
Подписывается ключом клиента или ключом ИС?

Добрый день!

В среднем за день 2000 подписей, подписывается ключом клиента

Мы проверили по порталу и схожей ошибки не обнаружили, но была ли вообще до этого такая ошибка?

Не совсем понял.
Пользователь передает ключ и пароль на сервер, где происходит подписание:
Init();
LoadKeyStore();
SidnData();
Finalize();

Затем подпись с сервера прилетает пользователю на фронт.
Так?

Добрый день!

Мы вернули нашу логику подписание через NCALayer (с множественным вводом пароля) и ошибки больше нет

У нас был сервис, который тоже периодически подписывал, после каждого подписания потребление памяти росло. Finalize не помогал. Видимо какая-то утечка памяти в библиотеке все-таки есть.