Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
На первый взгляд
Цель: Создание настраиваемого подключаемого модуля Прокси для разработки
Время: 30 минут
Плагины: Настраиваемый плагин
Prerequisites:Set up Dev Proxy, .NET 10 SDK
Из этой статьи вы узнаете, как создать пользовательский плагин для Dev-прокси. Создавая подключаемые модули для прокси-сервера разработки, вы можете расширить функциональные возможности и добавить пользовательские функции в соответствии с вашими потребностями.
Плагины HTTP и плагины stdio
Dev Proxy поддерживает два типа плагинов в зависимости от трафика, который вы хотите перехватывать.
Плагины HTTP перехватывают HTTP(S) запросы и ответы между вашими прикладными программами и API. Они наследуют и переопределяют методы, такие как и . Используйте подключаемые модули HTTP, если вы хотите имитировать ошибки API, добавлять макеты ответов, проверять заголовки запросов или иначе проверять и изменять HTTP-трафик.
Плагины Stdio перехватывают сообщения, отправленные через стандартизированные потоки ввода-вывода (stdin, stdout, stderr) между родительским и дочерним процессами. Они реализуют интерфейс (который также реализует) и переопределяют такие методы, как , и . Используйте подключаемые модули stdio при работе с инструментами, которые взаимодействуют через stdio, например серверы протокола контекста модели (MCP).
Один класс подключаемого модуля может обрабатывать трафик HTTP и stdio, переопределяя методы из обоих наборов.
Предварительные условия
Прежде чем приступить к созданию пользовательского плагина, убедитесь, что у вас есть следующие требования:
- .NET Core SDK версии 10
- Последняя версия библиотеки DLL для абстракций Dev Proxy, которую можно найти на странице выпусков Dev Proxy на #REF!.
Создайте новый подключаемый модуль
Выполните следующие действия, чтобы создать новый проект:
Создайте проект библиотеки классов с помощью команды.
dotnet new classlib -n MyCustomPluginОткройте созданный проект в Visual Studio Code.
code MyCustomPluginДобавьте DLL-файл Dev Proxy Abstractions () в папку проекта.
Добавьте ссылку на файл проекта.
<ItemGroup> <Reference Include="DevProxy.Abstractions"> <HintPath>.\DevProxy.Abstractions.dll</HintPath> <Private>false</Private> <ExcludeAssets>runtime</ExcludeAssets> </Reference> </ItemGroup>Добавьте пакеты NuGet, необходимые для проекта.
dotnet add package Microsoft.Extensions.Configuration dotnet add package Microsoft.Extensions.Configuration.Binder dotnet add package Microsoft.Extensions.Logging.Abstractions dotnet add package Unobtanium.Web.ProxyИсключите библиотеки динамической компоновки зависимостей (DLL) из выходных данных сборки, добавив по тегу для каждой в файле.
<ExcludeAssets>runtime</ExcludeAssets>Создайте новый класс, наследующий от класса.
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
{ "plugins": [{ "name": "CatchApiCallsPlugin", "enabled": true, "pluginPath": "./bin/Debug/net10.0/MyCustomPlugin.dll", }] }Запустите прокси-сервер разработки.
devproxy
Пример плагина проверяет все соответствующие URL-адреса на предмет требуемого заголовка. Если заголовок отсутствует, отображается предупреждение.
Добавление настраиваемой конфигурации в подключаемый модуль (необязательно)
Вы можете расширить логику вашего плагина, добавив пользовательскую конфигурацию.
Наследуется от класса. Прокси-сервер разработки на этапе выполнения предоставляет проанализированную конфигурацию подключаемого модуля через свойство .
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
{ "$schema": "https://raw.githubusercontent.com/dotnet/dev-proxy/main/schemas/v2.2.0/rc.schema.json", "plugins": [{ "name": "CatchApiCallsPlugin", "enabled": true, "pluginPath": "./bin/Debug/net10.0/MyCustomPlugin.dll", "configSection": "catchApiCalls" }], "catchApiCalls": { "requiredHeader": "Authorization" } }Запустите прокси-сервер разработки.
devproxy
См. также
- Архитектура подключаемого модуля
- Использование предустановленных конфигураций
- Настройка прокси-сервера разработки