Observação
O acesso a essa página exige autorização. Você pode tentar entrar ou alterar diretórios.
O acesso a essa página exige autorização. Você pode tentar alterar os diretórios.
Neste artigo, você aprenderá a criar um plug-in personalizado para o Dev Proxy. Ao criar plug-ins para o Dev Proxy, você pode estender sua funcionalidade e adicionar recursos personalizados para atender às suas necessidades.
Pré-requisitos
Antes de começar a criar um plug-in personalizado, verifique se você tem os seguintes pré-requisitos:
- SDK do .NET Core
- A versão mais recente da DLL Dev Proxy Abstractions, que você pode encontrar na página de versões do Dev Proxy GitHub
Criar um novo plugin
Siga as próximas etapas para criar um novo projeto:
Crie um novo projeto de biblioteca de classes usando o
dotnet new classlibcomando.dotnet new classlib -n MyCustomPluginAbra o projeto recém-criado no Visual Studio Code.
code MyCustomPluginAdicione a DLL Dev Proxy Abstractions (
dev-proxy-abstractions.dll) à pasta do projeto.Adicione o
dev-proxy-abstractions.dllcomo referência ao arquivo de projetoDevProxyCustomPlugin.csproj.<ItemGroup> <Reference Include="dev-proxy-abstractions"> <HintPath>.\dev-proxy-abstractions.dll</HintPath> <Private>false</Private> <ExcludeAssets>runtime</ExcludeAssets> </Reference> </ItemGroup>Adicione os pacotes NuGet necessários para seu projeto.
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.ProxyExclua as DLLs de dependência da saída de build adicionando uma
ExcludeAssetsmarca porPackageReferencenoDevProxyCustomPlugin.csprojarquivo.<ExcludeAssets>runtime</ExcludeAssets>Crie uma nova classe que implemente a
BaseProxyPlugininterface.using Microsoft.DevProxy.Abstractions; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.Logging; namespace MyCustomPlugin; public class CatchApiCalls(IPluginEvents pluginEvents, IProxyContext context, ILogger logger, ISet<UrlToWatch> UrlsToWatch, IConfigurationSection? configSection = null) : BaseProxyPlugin(pluginEvents, context, logger, UrlsToWatch, configSection) { public override string Name => nameof(CatchApiCalls); public override async Task RegisterAsync() { await base.RegisterAsync(); PluginEvents.BeforeRequest += BeforeRequestAsync; } private Task BeforeRequestAsync(object sender, ProxyRequestArgs e) { if (UrlsToWatch is null || !e.HasRequestUrlMatch(UrlsToWatch)) { // No match for the URL, so we don't need to do anything Logger.LogRequest("URL not matched", MessageType.Skipped, new LoggingContext(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; } return Task.CompletedTask; } }Compile o projeto.
dotnet build
Use seu plug-in personalizado
Para usar seu plug-in personalizado, você precisa adicioná-lo ao arquivo de configuração do Dev Proxy:
Adicione a nova configuração do plug-in no
devproxyrc.jsonarquivo.{ "plugins": [{ "name": "CatchApiCalls", "enabled": true, "pluginPath": "./bin/Debug/net8.0/MyCustomPlugin.dll", }] }Execute o proxy de desenvolvimento.
devproxy
O plug-in de exemplo verifica todos os URLs correspondentes para o cabeçalho de autorização necessário. Se o cabeçalho não estiver presente, ele mostrará uma mensagem de aviso.
Adicionando configuração personalizada ao seu plugin (opcional)
Você pode estender a lógica do seu plug-in adicionando uma configuração personalizada:
Adicione um novo
_configurationobjeto e vincule-o noRegistermétodo.using Microsoft.DevProxy.Abstractions; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.Logging; namespace MyCustomPlugin; public class CatchApiCallsConfiguration { public string? RequiredHeader { get; set; } } public class CatchApiCalls(IPluginEvents pluginEvents, IProxyContext context, ILogger logger, ISet<UrlToWatch> UrlsToWatch, IConfigurationSection? configSection = null) : BaseProxyPlugin(pluginEvents, context, logger, UrlsToWatch, configSection) { public override string Name => nameof(CatchApiCalls); // Define you custom configuration private readonly CatchApiCallsConfiguration _configuration = new(); public override async Task RegisterAsync() { await base.RegisterAsync(); // Bind your plugin configuration configSection?.Bind(_configuration); // Register your event handlers PluginEvents.BeforeRequest += BeforeRequestAsync; } private Task BeforeRequestAsync(object sender, ProxyRequestArgs e) { if (UrlsToWatch is null || !e.HasRequestUrlMatch(UrlsToWatch)) { // No match for the URL, so we don't need to do anything Logger.LogRequest("URL not matched", MessageType.Skipped, new LoggingContext(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; } return Task.CompletedTask; } }Compile o projeto.
dotnet buildAtualize seu
devproxyrc.jsonarquivo para incluir a nova configuração.{ "plugins": [{ "name": "CatchApiCalls", "enabled": true, "pluginPath": "./bin/Debug/net8.0/MyCustomPlugin.dll", "configSection": "catchApiCalls" }], "catchApiCalls": { "requiredHeader": "Authorization" // Example configuration } }Execute o proxy de desenvolvimento.
devproxy