Nota
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare ad accedere o modificare le directory.
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare a modificare le directory.
Questo articolo illustra come creare un plug-in personalizzato per il proxy di sviluppo. Creando plug-in per Dev Proxy, è possibile estenderne le funzionalità e aggiungere funzionalità personalizzate in base alle proprie esigenze.
Prerequisiti
Prima di iniziare a creare un plug-in personalizzato, assicurarsi di avere i prerequisiti seguenti:
- .NET v9 Core SDK
- La versione più recente della DLL astrazioni del proxy di sviluppo, disponibile nella pagina Delle versioni di GitHub di Dev Proxy
Creare un nuovo plug-in
Seguire i passaggi successivi per creare un nuovo progetto:
Creare un nuovo progetto di libreria di classi usando il
dotnet new classlibcomando .dotnet new classlib -n MyCustomPluginAprire il progetto appena creato in Visual Studio Code.
code MyCustomPluginAggiungere la DLL Dev Proxy Abstractions (
DevProxy.Abstractions.dll) alla cartella del progetto.Aggiungi
DevProxy.Abstractions.dllcome un riferimento al file di progettoDevProxyCustomPlugin.csproj.<ItemGroup> <Reference Include="DevProxy.Abstractions"> <HintPath>.\DevProxy.Abstractions.dll</HintPath> <Private>false</Private> <ExcludeAssets>runtime</ExcludeAssets> </Reference> </ItemGroup>Aggiungere i pacchetti NuGet necessari per il progetto.
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.ProxyEscludere le DLL di dipendenza dall'output di compilazione aggiungendo un
ExcludeAssetstag perPackageReferencenelDevProxyCustomPlugin.csprojfile.<ExcludeAssets>runtime</ExcludeAssets>Creare una nuova classe che eredita dalla
BaseProxyclasse .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) { 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; } }Crea il progetto.
dotnet build
Usare il plug-in personalizzato
Per usare il plug-in personalizzato, è necessario aggiungerlo al file di configurazione di Dev Proxy:
Aggiungere la nuova configurazione del plug-in nel
devproxyrc.jsonfile.{ "plugins": [{ "name": "CatchApiCallsPlugin", "enabled": true, "pluginPath": "./bin/Debug/net9.0/MyCustomPlugin.dll", }] }Eseguire il proxy di sviluppo.
devproxy
Il plug-in di esempio controlla tutti gli URL corrispondenti per l'intestazione richiesta Authorization . Se l'intestazione non è presente, viene visualizzato un messaggio di avviso.
Aggiunta di una configurazione personalizzata al plug-in (facoltativo)
È possibile estendere la logica del plug-in aggiungendo una configurazione personalizzata:
Ereditare dalla
BasePlugin<TConfiguration>classe . Dev Proxy espone la configurazione del plug-in analizzato in fase di esecuzione tramite laConfigurationproprietà .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; } }Crea il progetto.
dotnet buildAggiornare il
devproxyrc.jsonfile in modo da includere la nuova configurazione.{ "plugins": [{ "name": "CatchApiCallsPlugin", "enabled": true, "pluginPath": "./bin/Debug/net9.0/MyCustomPlugin.dll", "configSection": "catchApiCalls" }], "catchApiCalls": { "requiredHeader": "Authorization" // Example configuration } }Eseguire il proxy di sviluppo.
devproxy