Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
На первый взгляд
Цель: Создание настраиваемого подключаемого модуля Прокси для разработки
Время: 30 минут
Плагины: Настраиваемый плагин
Предварительные требования:настройка прокси-сервера разработки, .NET 10 SDK
Из этой статьи вы узнаете, как создать пользовательский плагин для Dev-прокси. Создавая подключаемые модули для прокси-сервера разработки, вы можете расширить функциональные возможности и добавить пользовательские функции в соответствии с вашими потребностями.
Плагины HTTP и плагины stdio
Dev Proxy поддерживает два типа плагинов в зависимости от трафика, который вы хотите перехватывать.
HTTP-плагины перехватывают HTTP(S)-запросы и ответы между вашим приложением и API. Они наследуются от
BasePluginи переопределяют такие методы, какBeforeRequestAsyncиBeforeResponseAsync. Используйте подключаемые модули HTTP, если вы хотите имитировать ошибки API, добавлять макеты ответов, проверять заголовки запросов или иначе проверять и изменять HTTP-трафик.Подключаемые модули Stdio перехватывают сообщения, отправленные по стандартным входным и выходным данным (stdin, stdout, stderr) между родительским процессом и дочерним процессом. Они реализуют
IStdioPluginинтерфейс (которыйBasePluginтакже реализует) и переопределяют такие методы, какBeforeStdinAsync,AfterStdoutAsyncиAfterStderrAsync. Используйте подключаемые модули stdio при работе с инструментами, которые взаимодействуют через stdio, например серверы протокола контекста модели (MCP).
Один класс подключаемого модуля может обрабатывать трафик HTTP и stdio, переопределяя методы из обоих наборов.
Предварительные условия
Прежде чем приступить к созданию пользовательского плагина, убедитесь, что у вас есть следующие требования:
Создайте новый подключаемый модуль
Выполните следующие действия, чтобы создать новый проект:
Создайте проект библиотеки классов с помощью
dotnet new classlibкоманды.dotnet new classlib -n MyCustomPluginОткройте созданный проект в Visual Studio Code.
code MyCustomPluginДобавьте пакет NuGet Dev Proxy Abstractions в свой проект.
dotnet add package DevProxy.AbstractionsИсключите библиотеки DLL зависимостей из выходных файлов сборки, добавив тег
ExcludeAssetsдля каждогоPackageReferenceв файлMyCustomPlugin.csproj.<ExcludeAssets>runtime</ExcludeAssets>Создайте новый класс, наследующий от
BaseProxyкласса.using DevProxy.Abstractions.Plugins; using DevProxy.Abstractions.Proxy; using Microsoft.Extensions.Logging; namespace MyCustomPlugin; public sealed class CatchApiCallsPlugin( ILogger<CatchApiCallsPlugin> logger, ISet<UrlToWatch> urlsToWatch) : BasePlugin(logger, urlsToWatch) { public override string Name => nameof(CatchApiCallsPlugin); public override Task BeforeRequestAsync(ProxyRequestArgs e, CancellationToken cancellationToken) { Logger.LogTrace("{Method} called", nameof(BeforeRequestAsync)); ArgumentNullException.ThrowIfNull(e); if (!e.HasRequestUrlMatch(UrlsToWatch)) { Logger.LogRequest("URL not matched", MessageType.Skipped, new(e.Session)); return Task.CompletedTask; } var headers = e.Session.HttpClient.Request.Headers; var header = headers.Where(h => h.Name == "Authorization").FirstOrDefault(); if (header is null) { Logger.LogRequest($"Does not contain the Authorization header", MessageType.Warning, new LoggingContext(e.Session)); return Task.CompletedTask; } Logger.LogTrace("Left {Name}", nameof(BeforeRequestAsync)); return Task.CompletedTask; } }Создайте свой проект.
dotnet build
Использование пользовательского подключаемого модуля
Чтобы использовать настраиваемый подключаемый модуль, необходимо добавить его в файл конфигурации тестового прокси-сервера.
Добавьте новую конфигурацию плагина в файл
devproxyrc.json.Файл: devproxyrc.json
{ "plugins": [{ "name": "CatchApiCallsPlugin", "enabled": true, "pluginPath": "./bin/Debug/net10.0/MyCustomPlugin.dll", }] }Запустите прокси-сервер разработки.
devproxy
Пример плагина проверяет все соответствующие URL-адреса на предмет требуемого Authorization заголовка. Если заголовок отсутствует, отображается предупреждение.
Добавление настраиваемой конфигурации в подключаемый модуль (необязательно)
Вы можете расширить логику вашего плагина, добавив пользовательскую конфигурацию.
Наследуется от
BasePlugin<TConfiguration>класса. Прокси-сервер разработки на этапе выполнения предоставляет проанализированную конфигурацию подключаемого модуля через свойствоConfiguration.using DevProxy.Abstractions.Plugins; using DevProxy.Abstractions.Proxy; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.Logging; namespace MyCustomPlugin; public sealed class CatchApiCallsConfiguration { public string? RequiredHeader { get; set; } } public sealed class CatchApiCallsPlugin( HttpClient httpClient, ILogger<CatchApiCallsPlugin> logger, ISet<UrlToWatch> urlsToWatch, IProxyConfiguration proxyConfiguration, IConfigurationSection pluginConfigurationSection) : BasePlugin<CatchApiCallsConfiguration>( httpClient, logger, urlsToWatch, proxyConfiguration, pluginConfigurationSection) { public override string Name => nameof(CatchApiCallsPlugin); public override Task BeforeRequestAsync(ProxyRequestArgs e, CancellationToken cancellationToken) { Logger.LogTrace("{Method} called", nameof(BeforeRequestAsync)); ArgumentNullException.ThrowIfNull(e); if (!e.HasRequestUrlMatch(UrlsToWatch)) { Logger.LogRequest("URL not matched", MessageType.Skipped, new(e.Session)); return Task.CompletedTask; } // Start using your custom configuration var requiredHeader = Configuration.RequiredHeader ?? string.Empty; if (string.IsNullOrEmpty(requiredHeader)) { // Required header is not set, so we don't need to do anything Logger.LogRequest("Required header not set", MessageType.Skipped, new LoggingContext(e.Session)); return Task.CompletedTask; } var headers = e.Session.HttpClient.Request.Headers; var header = headers.Where(h => h.Name == requiredHeader).FirstOrDefault(); if (header is null) { Logger.LogRequest($"Does not contain the {requiredHeader} header", MessageType.Warning, new LoggingContext(e.Session)); return Task.CompletedTask; } Logger.LogTrace("Left {Name}", nameof(BeforeRequestAsync)); return Task.CompletedTask; } }Создайте свой проект.
dotnet buildОбновите
devproxyrc.jsonфайл, чтобы включить новую конфигурацию.Файл: devproxyrc.json
{ "$schema": "https://raw.githubusercontent.com/dotnet/dev-proxy/main/schemas/v3.1.0/rc.schema.json", "plugins": [{ "name": "CatchApiCallsPlugin", "enabled": true, "pluginPath": "./bin/Debug/net10.0/MyCustomPlugin.dll", "configSection": "catchApiCalls" }], "catchApiCalls": { "requiredHeader": "Authorization" } }Запустите прокси-сервер разработки.
devproxy