Nota:
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
En este artículo, aprenderá a crear un complemento personalizado para el proxy de desarrollo. Al crear complementos para el proxy de desarrollo, puede ampliar su funcionalidad y agregar características personalizadas para satisfacer sus necesidades.
Requisitos previos
Antes de empezar a crear un complemento personalizado, asegúrese de que tiene los siguientes requisitos previos:
- SDK de .NET Core
- La versión más reciente de la DLL de abstracciones de proxy de desarrollo, que puede encontrar en la página de versiones de GitHub del proxy de desarrollo.
Creación de un complemento
Siga los pasos siguientes para crear un proyecto:
Cree un nuevo proyecto de biblioteca de clases mediante el
dotnet new classlibcomando .dotnet new classlib -n MyCustomPluginAbra el proyecto recién creado en Visual Studio Code.
code MyCustomPluginAgregue el archivo DLL de abstracciones de proxy de desarrollo (
dev-proxy-abstractions.dll) a la carpeta del proyecto.Agregue como
dev-proxy-abstractions.dllreferencia al archivo del proyectoDevProxyCustomPlugin.csproj.<ItemGroup> <Reference Include="dev-proxy-abstractions"> <HintPath>.\dev-proxy-abstractions.dll</HintPath> <Private>false</Private> <ExcludeAssets>runtime</ExcludeAssets> </Reference> </ItemGroup>Agregue los paquetes NuGet necesarios para el proyecto.
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.ProxyExcluya los archivos DLL de dependencia de la salida de compilación agregando una
ExcludeAssetsetiqueta porPackageReferenceen elDevProxyCustomPlugin.csprojarchivo.<ExcludeAssets>runtime</ExcludeAssets>Cree una nueva clase que implemente la
BaseProxyPlugininterfaz .using Microsoft.DevProxy.Abstractions; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.Logging; namespace MyCustomPlugin; public class CatchApiCalls(IPluginEvents pluginEvents, IProxyContext context, ILogger logger, ISet<UrlToWatch> UrlsToWatch, IConfigurationSection? configSection = null) : BaseProxyPlugin(pluginEvents, context, logger, UrlsToWatch, configSection) { public override string Name => nameof(CatchApiCalls); public override async Task RegisterAsync() { await base.RegisterAsync(); PluginEvents.BeforeRequest += BeforeRequestAsync; } private Task BeforeRequestAsync(object sender, ProxyRequestArgs e) { if (UrlsToWatch is null || !e.HasRequestUrlMatch(UrlsToWatch)) { // No match for the URL, so we don't need to do anything Logger.LogRequest("URL not matched", MessageType.Skipped, new LoggingContext(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; } return Task.CompletedTask; } }Compile el proyecto.
dotnet build
Uso del complemento personalizado
Para usar el complemento personalizado, debe agregarlo al archivo de configuración del proxy de desarrollo:
Agregue la nueva configuración del complemento en el
devproxyrc.jsonarchivo.{ "plugins": [{ "name": "CatchApiCalls", "enabled": true, "pluginPath": "./bin/Debug/net8.0/MyCustomPlugin.dll", }] }Ejecute el proxy de desarrollo.
devproxy
El complemento de ejemplo comprueba todas las direcciones URL coincidentes para el encabezado de autorización necesario. Si el encabezado no está presente, se muestra un mensaje de advertencia.
Adición de una configuración personalizada al complemento (opcional)
Puede ampliar la lógica del complemento agregando una configuración personalizada:
Agregue un nuevo
_configurationobjeto y enlazarlo en elRegistermétodo .using Microsoft.DevProxy.Abstractions; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.Logging; namespace MyCustomPlugin; public class CatchApiCallsConfiguration { public string? RequiredHeader { get; set; } } public class CatchApiCalls(IPluginEvents pluginEvents, IProxyContext context, ILogger logger, ISet<UrlToWatch> UrlsToWatch, IConfigurationSection? configSection = null) : BaseProxyPlugin(pluginEvents, context, logger, UrlsToWatch, configSection) { public override string Name => nameof(CatchApiCalls); // Define you custom configuration private readonly CatchApiCallsConfiguration _configuration = new(); public override async Task RegisterAsync() { await base.RegisterAsync(); // Bind your plugin configuration configSection?.Bind(_configuration); // Register your event handlers PluginEvents.BeforeRequest += BeforeRequestAsync; } private Task BeforeRequestAsync(object sender, ProxyRequestArgs e) { if (UrlsToWatch is null || !e.HasRequestUrlMatch(UrlsToWatch)) { // No match for the URL, so we don't need to do anything Logger.LogRequest("URL not matched", MessageType.Skipped, new LoggingContext(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; } return Task.CompletedTask; } }Compile el proyecto.
dotnet buildActualice el
devproxyrc.jsonarchivo para incluir la nueva configuración.{ "plugins": [{ "name": "CatchApiCalls", "enabled": true, "pluginPath": "./bin/Debug/net8.0/MyCustomPlugin.dll", "configSection": "catchApiCalls" }], "catchApiCalls": { "requiredHeader": "Authorization" // Example configuration } }Ejecute el proxy de desarrollo.
devproxy