Freigeben über


Erstellen eines benutzerdefinierten Plug-Ins

Auf einen Blick
Ziel: Erstellen eines benutzerdefinierten Dev Proxy-Plug-Ins
Zeit: 30 Minuten
Plugins: Benutzerdefiniertes Plug-In
Prerequisites:Set up Dev Proxy, .NET 10 SDK

In diesem Artikel erfahren Sie, wie Sie ein benutzerdefiniertes Plug-In für den Dev-Proxy erstellen. Durch das Erstellen von Plug-Ins für Dev Proxy können Sie seine Funktionalität erweitern und benutzerdefinierte Features hinzufügen, um Ihren Anforderungen gerecht zu werden.

HTTP-Plug-Ins im Vergleich zu Stdio-Plug-Ins

Dev Proxy unterstützt zwei Arten von Plug-Ins je nach Datenverkehr, den Sie abfangen möchten:

  • HTTP-Plugins fangen HTTP(S)-Anfragen und -Antworten zwischen Ihrer App und APIs ab. Sie erben von Methoden wie und überschreiben sie. Verwenden Sie HTTP-Plug-Ins, wenn Sie API-Fehler simulieren, simulierte Antworten hinzufügen, Anforderungsheader überprüfen oder anderweitig HTTP-Datenverkehr überprüfen und ändern möchten.

  • Stdio-Plugins fangen Nachrichten ab, die über die Standardkanäle stdin, stdout, stderr zwischen einem übergeordneten und einem untergeordneten Prozess gesendet werden. Sie implementieren die Schnittstelle (die auch implementiert wird) und überschreiben Methoden wie , und . Verwenden Sie Stdio-Plug-Ins beim Arbeiten mit Tools, die über Stdio kommunizieren, z. B. McP-Server (Model Context Protocol).

Eine einzelne Plug-In-Klasse kann sowohl HTTP- als auch Stdiodatenverkehr verarbeiten, indem Methoden aus beiden Sätzen überschrieben werden.

Voraussetzungen

Bevor Sie mit dem Erstellen eines benutzerdefinierten Plug-Ins beginnen, stellen Sie sicher, dass Sie über die folgenden Voraussetzungen verfügen:

Erstellen eines neuen Plug-Ins

Führen Sie die nächsten Schritte aus, um ein neues Projekt zu erstellen:

  1. Erstellen Sie mithilfe des Befehls ein neues Klassenbibliotheksprojekt.

    dotnet new classlib -n MyCustomPlugin
    
  2. Öffnen Sie das neu erstellte Projekt in Visual Studio Code.

    code MyCustomPlugin
    
  3. Fügen Sie die Dev Proxy Abstractions DLL () zum Projektordner hinzu.

  4. Fügen Sie als Verweis in Ihre Projektdatei hinzu.

    <ItemGroup>
      <Reference Include="DevProxy.Abstractions">
        <HintPath>.\DevProxy.Abstractions.dll</HintPath>
        <Private>false</Private>
        <ExcludeAssets>runtime</ExcludeAssets>
      </Reference>
    </ItemGroup>
    
  5. Fügen Sie die für Ihr Projekt erforderlichen NuGet-Pakete hinzu.

    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.Proxy
    
  6. Schließen Sie die Abhängigkeitsbibliotheken (Dynamic Link Libraries, DLLs) aus der Buildausgabe aus, indem Sie ein Tag pro Datei hinzufügen.

    <ExcludeAssets>runtime</ExcludeAssets>
    
  7. Erstellen Sie eine neue Klasse, die von der Klasse erbt.

    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;
        }
    }
    
  8. Erstellen Sie das Projekt.

    dotnet build
    

Verwenden Ihres benutzerdefinierten Plug-Ins

Um Ihr benutzerdefiniertes Plug-In zu verwenden, müssen Sie es der Dev Proxy-Konfigurationsdatei hinzufügen:

  1. Fügen Sie die neue Plug-In-Konfiguration in der Datei hinzu.

    Datei: devproxyrc.json

    {
      "plugins": [{
        "name": "CatchApiCallsPlugin",
        "enabled": true,
        "pluginPath": "./bin/Debug/net10.0/MyCustomPlugin.dll",
      }]
    }
    
  2. Führen Sie den Dev-Proxy aus.

    devproxy
    

Das Beispiel-Plug-In überprüft alle übereinstimmenden URLs auf den erforderlichen Header. Wenn die Kopfzeile nicht vorhanden ist, wird eine Warnmeldung angezeigt.

Hinzufügen einer benutzerdefinierten Konfiguration zu Ihrem Plug-In (optional)

Sie können die Logik Ihres Plug-Ins erweitern, indem Sie eine benutzerdefinierte Konfiguration hinzufügen:

  1. Erbe von der Klasse. Dev Proxy stellt zur Laufzeit die analysierte Plug-in-Konfiguration über die -Eigenschaft bereit.

    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. Erstellen Sie das Projekt.

    dotnet build
    
  3. Aktualisieren Sie Ihre Datei so, dass sie die neue Konfiguration enthält.

    Datei: 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"
      }
    }
    
  4. Führen Sie den Dev-Proxy aus.

    devproxy
    

Siehe auch

  • Plug-In-Architektur
  • Verwenden von voreingestellten Konfigurationen
  • Konfigurieren des Dev-Proxys