Skapa ett anpassat plugin-program

Överblick
Mål: Skapa ett anpassat Dev Proxy-plugin-program
Tid: 30 minuter
Plugins: Anpassat plugin-program
Krav:Konfigurera Dev Proxy, .NET 10 SDK

I den här artikeln får du lära dig hur du skapar ett anpassat plugin-program för Dev Proxy. Genom att skapa plugin-program för Dev Proxy kan du utöka dess funktioner och lägga till anpassade funktioner så att de passar dina behov.

HTTP-plugin-program jämfört med stdio-plugin-program

Dev Proxy stöder två typer av plugin-program beroende på vilken trafik du vill fånga upp:

  • HTTP-plugin-program fångar upp HTTP(S) begäranden och svar mellan din app och API:er. De ärver från BasePlugin och åsidosätter metoder som BeforeRequestAsync och BeforeResponseAsync. Använd HTTP-plugin-program när du vill simulera API-fel, lägga till falska svar, validera begärandehuvuden eller på annat sätt inspektera och ändra HTTP-trafik.

  • Stdio-plugin-program fångar upp meddelanden som skickas via standardindata/utdata (stdin, stdout, stderr) mellan en överordnad process och en underordnad process. De implementerar IStdioPlugin gränssnittet (som BasePlugin även implementerar) och åsidosätter metoder som BeforeStdinAsync, AfterStdoutAsyncoch AfterStderrAsync. Använd stdio-plugin-program när du arbetar med verktyg som kommunicerar via stdio, till exempel MCP-servrar (Model Context Protocol).

En enda plugin-klass kan hantera både HTTP- och stdio-trafik genom att åsidosätta metoder från båda uppsättningarna.

Förutsättningar

Innan du börjar skapa ett anpassat plugin-program kontrollerar du att du har följande förutsättningar:

Skapa ett nytt plugin-program

Följ nästa steg för att skapa ett nytt projekt:

  1. Skapa ett nytt klassbiblioteksprojekt med kommandot dotnet new classlib .

    dotnet new classlib -n MyCustomPlugin
    
  2. Öppna det nyligen skapade projektet i Visual Studio Code.

    code MyCustomPlugin
    
  3. Lägg till NuGet-paketet Dev Proxy Abstractions i projektet.

    dotnet add package DevProxy.Abstractions
    
  4. Undanta beroendebiblioteken för dynamisk länk (DLL) från byggutdata genom att lägga till en ExcludeAssets tagg per PackageReference i MyCustomPlugin.csproj filen.

    <ExcludeAssets>runtime</ExcludeAssets>
    
  5. Skapa en ny klass som ärver från BaseProxy klassen.

    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;
        }
    }
    
  6. Skapa ditt projekt.

    dotnet build
    

Använda ditt anpassade plugin-program

Om du vill använda ditt anpassade plugin-program måste du lägga till det i konfigurationsfilen för Dev Proxy:

  1. Lägg till den nya plugin-konfigurationen devproxyrc.json i filen.

    Fil: devproxyrc.json

    {
      "plugins": [{
        "name": "CatchApiCallsPlugin",
        "enabled": true,
        "pluginPath": "./bin/Debug/net10.0/MyCustomPlugin.dll",
      }]
    }
    
  2. Kör Dev Proxy.

    devproxy
    

Exempelpluginet kontrollerar alla matchande URL:er för den nödvändiga Authorization headern. Om rubriken inte finns visas ett varningsmeddelande.

Lägga till anpassad konfiguration i plugin-programmet (valfritt)

Du kan utöka logiken för plugin-programmet genom att lägga till anpassad konfiguration:

  1. Ärv från BasePlugin<TConfiguration> klassen. Dev Proxy exponerar vid körtid pluginens konfiguration med hjälp av Configuration-egenskapen.

    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;
        }
    }
    
  2. Skapa ditt projekt.

    dotnet build
    
  3. devproxyrc.json Uppdatera filen så att den innehåller den nya konfigurationen.

    Fil: devproxyrc.json

    {
      "$schema": "https://raw.githubusercontent.com/dotnet/dev-proxy/main/schemas/v3.0.0/rc.schema.json",
      "plugins": [{
        "name": "CatchApiCallsPlugin",
        "enabled": true,
        "pluginPath": "./bin/Debug/net10.0/MyCustomPlugin.dll",
        "configSection": "catchApiCalls"
      }],
      "catchApiCalls": {
        "requiredHeader": "Authorization"
      }
    }
    
  4. Kör Dev Proxy.

    devproxy
    

Se även