Как подойти к удалению ненужной реализации при вызове нативного метода из WebAPI - PullRequest
0 голосов
/ 01 ноября 2019

У меня есть веб-сервер WebAPI с ядром dotnet, который должен выполнять собственный метод, написанный на Win32 C ++. Проблема в том, что каждый раз, когда вызывается этот метод, ему нужно создавать множество вещей, прежде чем он сможет делать то, что ему нужно, это добавляет задержки к запросу. (В настоящее время он использует DLLImport для доступа к методу C ++ в скомпилированной DLL).

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

Какой рекомендуемый подход для этого? У меня есть полный доступ к коду C ++ и коду сервера WebAPI, поэтому я могу делать все, что нужно для этого.

1 Ответ

0 голосов
/ 03 ноября 2019

Вы можете настроить некоторую инфраструктуру IPC между ними. Один из способов сделать это - сделать вашу DLL COM-совместимой. Т.е. наличие DLL будет COM-сервером для некоторого COM-класса. Затем серверный процесс создаст класс CreateInstance, который автоматически запустит ваш собственный процесс. Тогда вызов будет просто обычным вызовом функции, COM будет обрабатывать RPC.

Другим более простым способом будет использование именованного файла с отображением в памяти. Оба процесса откроют дескриптор этого, там вы можете хранить очередь или некоторую структуру данных. Процесс сервера будет выдвигаться, пока всплывает собственный процесс. Вы можете использовать события Windows для синхронизации этого. Вы можете написать это самостоятельно или использовать что-то вроде boost :: interprocess для C ++. Я предполагаю, что могут быть другие библиотеки IPC, которые вы можете найти для этого.

Вы также можете использовать трубу, я знаю, что в C # есть несколько простых способов обработки труб Windows. Каналы не нуждаются в синхронизации, но для эффективной обработки ряда таких запросов может потребоваться несколько потоков в собственном процессе для чтения из канала.

Лично я бы использовал COM, если это возможно. Поскольку это будет скрывать для вас низкоуровневые вещи IPC, которые могут быть провалом. Это немного дольше, чтобы установить.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...