Compartir a través de


Creación de un complemento personalizado

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:

Creación de un complemento

Siga los pasos siguientes para crear un proyecto:

  1. Cree un nuevo proyecto de biblioteca de clases mediante el dotnet new classlib comando .

    dotnet new classlib -n MyCustomPlugin
    
  2. Abra el proyecto recién creado en Visual Studio Code.

    code MyCustomPlugin
    
  3. Agregue el archivo DLL de abstracciones de proxy de desarrollo (DevProxy.Abstractions.dll) a la carpeta del proyecto.

  4. Agregue como DevProxy.Abstractions.dll referencia al archivo del proyecto DevProxyCustomPlugin.csproj .

    <ItemGroup>
      <Reference Include="DevProxy.Abstractions">
        <HintPath>.\DevProxy.Abstractions.dll</HintPath>
        <Private>false</Private>
        <ExcludeAssets>runtime</ExcludeAssets>
      </Reference>
    </ItemGroup>
    
  5. 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.Proxy
    
  6. Excluya los archivos DLL de dependencia de la salida de compilación agregando una ExcludeAssets etiqueta por PackageReference en el DevProxyCustomPlugin.csproj archivo.

    <ExcludeAssets>runtime</ExcludeAssets>
    
  7. Cree una nueva clase que herede de la BaseProxy clase .

    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;
        }
    }
    
  8. 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:

  1. Agregue la nueva configuración del complemento en el devproxyrc.json archivo.

    Archivo: devproxyrc.json

    {
      "plugins": [{
        "name": "CatchApiCallsPlugin",
        "enabled": true,
        "pluginPath": "./bin/Debug/net9.0/MyCustomPlugin.dll",
      }]
    }
    
  2. 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:

  1. Hereda de la clase BasePlugin<TConfiguration>. El proxy de desarrollo expone la configuración del complemento interpretada a través de la propiedad Configuration en 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;
        }
    }
    
  2. Compile el proyecto.

    dotnet build
    
  3. Actualice el devproxyrc.json archivo 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
      }
    }
    
  4. Ejecute el proxy de desarrollo.

    devproxy
    

Consulte también