Примечание
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Из этой статьи вы узнаете, как создать пользовательский плагин для Dev-прокси. Создавая подключаемые модули для прокси-сервера разработки, вы можете расширить функциональные возможности и добавить пользовательские функции в соответствии с вашими потребностями.
Предварительные условия
Прежде чем приступить к созданию пользовательского плагина, убедитесь, что у вас есть следующие требования:
- Пакет SDK для .NET версии 9 Core
- Последняя версия библиотеки DLL абстракции прокси-сервера разработки, которую можно найти на странице выпусков GitHub для прокси-сервера разработки.
Создайте новый подключаемый модуль
Выполните следующие действия, чтобы создать новый проект:
Создайте проект библиотеки классов с помощью
dotnet new classlib
команды.dotnet new classlib -n MyCustomPlugin
Откройте созданный проект в Visual Studio Code.
code MyCustomPlugin
Добавьте DLL-файл Dev Proxy Abstractions (
DevProxy.Abstractions.dll
) в папку проекта.DevProxy.Abstractions.dll
Добавьте ссылку на файл проектаDevProxyCustomPlugin.csproj
.<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
на каждыйPackageReference
в файлеDevProxyCustomPlugin.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) { 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/net9.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( ILogger<CatchApiCallsPlugin> logger, ISet<UrlToWatch> urlsToWatch, IProxyConfiguration proxyConfiguration, IConfigurationSection pluginConfigurationSection) : BasePlugin<CatchApiCallsConfiguration>( logger, urlsToWatch, proxyConfiguration, pluginConfigurationSection) { public override string Name => nameof(CatchApiCallsPlugin); public override Task BeforeRequestAsync(ProxyRequestArgs e) { 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
файл, чтобы включить новую конфигурацию.{ "plugins": [{ "name": "CatchApiCallsPlugin", "enabled": true, "pluginPath": "./bin/Debug/net9.0/MyCustomPlugin.dll", "configSection": "catchApiCalls" }], "catchApiCalls": { "requiredHeader": "Authorization" // Example configuration } }
Запустите прокси-сервер разработки.
devproxy