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.
De un vistazo
Objetivo: Crear un complemento de proxy Dev personalizado
Tiempo: 30 minutos
Complementos: Complemento personalizado
Requisitos previos:Configuración del proxy de desarrollo, SDK de .NET 9
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 v9 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 (
DevProxy.Abstractions.dll) a la carpeta del proyecto.Agregue como
DevProxy.Abstractions.dllreferencia al archivo del proyectoDevProxyCustomPlugin.csproj.<ItemGroup> <Reference Include="DevProxy.Abstractions"> <HintPath>.\DevProxy.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 herede de la
BaseProxyclase .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; } }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.Archivo: devproxyrc.json
{ "plugins": [{ "name": "CatchApiCallsPlugin", "enabled": true, "pluginPath": "./bin/Debug/net9.0/MyCustomPlugin.dll", }] }Ejecute el proxy de desarrollo.
devproxy
El complemento de ejemplo comprueba todas las direcciones URL coincidentes para el encabezado necesario Authorization . 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:
Hereda de la clase
BasePlugin<TConfiguration>. El proxy de desarrollo expone la configuración del complemento interpretada a través de la propiedadConfigurationen tiempo de ejecución.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; } }Compile el proyecto.
dotnet buildActualice el
devproxyrc.jsonarchivo para incluir la nueva configuración.Archivo: devproxyrc.json
{ "plugins": [{ "name": "CatchApiCallsPlugin", "enabled": true, "pluginPath": "./bin/Debug/net9.0/MyCustomPlugin.dll", "configSection": "catchApiCalls" }], "catchApiCalls": { "requiredHeader": "Authorization" // Example configuration } }Ejecute el proxy de desarrollo.
devproxy