Kommentar
Åtkomst till den här sidan kräver auktorisering. Du kan prova att logga in eller ändra kataloger.
Åtkomst till den här sidan kräver auktorisering. Du kan prova att ändra kataloger.
Ö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
BasePluginoch åsidosätter metoder somBeforeRequestAsyncochBeforeResponseAsync. 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
IStdioPlugingränssnittet (somBasePluginäven implementerar) och åsidosätter metoder somBeforeStdinAsync,AfterStdoutAsyncochAfterStderrAsync. 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:
Skapa ett nytt klassbiblioteksprojekt med kommandot
dotnet new classlib.dotnet new classlib -n MyCustomPluginÖppna det nyligen skapade projektet i Visual Studio Code.
code MyCustomPluginLägg till NuGet-paketet Dev Proxy Abstractions i projektet.
dotnet add package DevProxy.AbstractionsUndanta beroendebiblioteken för dynamisk länk (DLL) från byggutdata genom att lägga till en
ExcludeAssetstagg perPackageReferenceiMyCustomPlugin.csprojfilen.<ExcludeAssets>runtime</ExcludeAssets>Skapa en ny klass som ärver från
BaseProxyklassen.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; } }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:
Lägg till den nya plugin-konfigurationen
devproxyrc.jsoni filen.Fil: devproxyrc.json
{ "plugins": [{ "name": "CatchApiCallsPlugin", "enabled": true, "pluginPath": "./bin/Debug/net10.0/MyCustomPlugin.dll", }] }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:
Ärv från
BasePlugin<TConfiguration>klassen. Dev Proxy exponerar vid körtid pluginens konfiguration med hjälp avConfiguration-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; } }Skapa ditt projekt.
dotnet builddevproxyrc.jsonUppdatera 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" } }Kör Dev Proxy.
devproxy