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
Prerequisites:Set up 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 och åsidosätter metoder som och . 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 gränssnittet (som även implementerar) och åsidosätter metoder som , och . 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:
- .NET v10 Core SDK
- Den senaste versionen av Dev Proxy Abstractions DLL, som du hittar på sidan Dev Proxy GitHub
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 -n MyCustomPluginÖppna det nyligen skapade projektet i Visual Studio Code.
code MyCustomPluginLägg till Dev Proxy Abstractions DLL () i projektmappen.
Lägg till som en referens i din projektfil.
<ItemGroup> <Reference Include="DevProxy.Abstractions"> <HintPath>.\DevProxy.Abstractions.dll</HintPath> <Private>false</Private> <ExcludeAssets>runtime</ExcludeAssets> </Reference> </ItemGroup>Lägg till De NuGet-paket som krävs för projektet.
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.ProxyUndanta beroendebiblioteken för dynamisk länk (DLL) från byggutdata genom att lägga till en tagg per i filen.
<ExcludeAssets>runtime</ExcludeAssets>Skapa en ny klass som ärver från 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; } }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 i 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 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 klassen. Dev Proxy exponerar vid körtid pluginens konfiguration med hjälp av -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 buildUppdatera filen så att den innehåller den nya konfigurationen.
Fil: devproxyrc.json
{ "$schema": "https://raw.githubusercontent.com/dotnet/dev-proxy/main/schemas/v2.2.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
Se även
- Plugin-arkitektur
- Använda förinställda konfigurationer
- Konfigurera Dev Proxy