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:Configurar Dev Proxy, .NET 10 SDK
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.
Complementos HTTP frente a complementos stdio
Dev Proxy admite dos tipos de complementos en función del tráfico que quiera interceptar:
Los complementos HTTP interceptan las solicitudes y respuestas HTTP(S) entre la aplicación y las API. Heredan de
BasePluginy invalidan métodos comoBeforeRequestAsyncyBeforeResponseAsync. Use complementos HTTP cuando quiera simular errores de API, agregar respuestas simuladas, validar encabezados de solicitud o inspeccionar y modificar el tráfico HTTP.Los complementos stdio interceptan los mensajes enviados a través de la entrada y salida estándar (stdin, stdout, stderr) entre un proceso primario y un proceso secundario. Implementan la
IStdioPlugininterfaz (queBasePlugintambién implementa) e invalidan métodos comoBeforeStdinAsync,AfterStdoutAsyncyAfterStderrAsync. Use complementos stdio al trabajar con herramientas que se comunican a través de stdio, como servidores de Protocolo de contexto de modelo (MCP).
Una sola clase de complemento puede controlar el tráfico HTTP y stdio invalidando métodos de ambos conjuntos.
Requisitos previos
Antes de empezar a crear un complemento personalizado, asegúrese de que tiene los siguientes requisitos previos:
- SDK de .NET v10 Core
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 paquete NuGet Abstracciones de Dev Proxy a su proyecto.
dotnet add package DevProxy.AbstractionsExcluya las bibliotecas de vínculos dinámicos (DLL) de dependencia de la salida de compilación agregando la etiqueta
ExcludeAssetspor cadaPackageReferenceen el archivoMyCustomPlugin.csproj.<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; } }Construya su 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/net10.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( 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; } }Construya su proyecto.
dotnet buildActualice el
devproxyrc.jsonarchivo para incluir la nueva configuración.Archivo: 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" } }Ejecute el proxy de desarrollo.
devproxy