Megosztás a következőn keresztül:


Egyéni beépülő modul létrehozása

Egy pillantással
Cél: Egyéni Dev Proxy beépülő modul létrehozása
Idő: 30 perc
Beépülő modulok: Egyéni beépülő modul
Prerequisites:Set up Dev Proxy, .NET 10 SDK

Ebből a cikkből megtudhatja, hogyan hozhat létre egyéni beépülő modult a fejlesztői proxyhoz. A Dev Proxy beépülő moduljainak létrehozásával kibővítheti annak funkcióit, és egyéni funkciókat adhat hozzá az igényeinek megfelelően.

HTTP-beépülő modulok és stdio beépülő modulok

A Dev Proxy kétféle beépülő modult támogat a lehallgatni kívánt forgalomtól függően:

  • A HTTP(S)-beépülő modulok elfogják az alkalmazás és az API-k közötti HTTP(S)-kéréseket és -válaszokat. Öröklik és felülbírálják az olyan metódusokat, mint és . HTTP-beépülő modulokat akkor használjon, ha API-hibákat szeretne szimulálni, hamis válaszokat szeretne hozzáadni, ellenőrizni szeretné a kérelem fejléceit, vagy más módon szeretné megvizsgálni és módosítani a HTTP-forgalmat.

  • Az Stdio beépülő modulok elfogják a standard bemeneti/kimeneti (stdin, stdout, stderr) üzeneteket a szülőfolyamat és a gyermekfolyamat között. Implementálják az interfészt (amely szintén implementálja) és felülbírálják az olyan módszereket, mint a , és . Stdio beépülő modulokat használjon az stdio-n keresztül kommunikáló eszközök, például a Model Context Protocol (MCP) kiszolgálóinak használatakor.

Egyetlen beépülő modulosztály képes kezelni a HTTP- és a stdio-forgalmat úgy, hogy felül kell bírálni mindkét halmaz metódusát.

Előfeltételek

Mielőtt elkezdené létrehozni az egyéni beépülő modult, győződjön meg arról, hogy rendelkezik az alábbi előfeltételekkel:

Új beépülő modul létrehozása

Új projekt létrehozásához kövesse a következő lépéseket:

  1. Hozzon létre egy új osztálytárprojektet a paranccsal.

    dotnet new classlib -n MyCustomPlugin
    
  2. Nyissa meg az újonnan létrehozott projektet a Visual Studio Code.

    code MyCustomPlugin
    
  3. Adja hozzá a Fejlesztői proxy-absztrakciók DLL-t () a projektmappához.

  4. Adja hozzá a elemet hivatkozásként a projekt fájlhoz.

    <ItemGroup>
      <Reference Include="DevProxy.Abstractions">
        <HintPath>.\DevProxy.Abstractions.dll</HintPath>
        <Private>false</Private>
        <ExcludeAssets>runtime</ExcludeAssets>
      </Reference>
    </ItemGroup>
    
  5. Adja hozzá a projekthez szükséges NuGet-csomagokat.

    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. Zárja ki a függőségi dinamikus csatolású kódtárakat (DLL-eket) a buildkimenetből, ha hozzáad egy címkét a fájlhoz.

    <ExcludeAssets>runtime</ExcludeAssets>
    
  7. Hozzon létre egy új osztályt, amely az osztálytól örököl.

    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. Hozza létre a projektet.

    dotnet build
    

Egyéni beépülő modul használata

Az egyéni beépülő modul használatához hozzá kell adnia azt a Dev Proxy konfigurációs fájljához:

  1. Adja hozzá az új beépülő modulkonfigurációt a fájlhoz.

    Fájl: devproxyrc.json

    {
      "plugins": [{
        "name": "CatchApiCallsPlugin",
        "enabled": true,
        "pluginPath": "./bin/Debug/net10.0/MyCustomPlugin.dll",
      }]
    }
    
  2. Futtassa a fejlesztői proxyt.

    devproxy
    

A példa beépülő modul ellenőrzi a szükséges fejléc összes egyező URL-címét. Ha a fejléc nem található, figyelmeztető üzenet jelenik meg.

Egyéni konfiguráció hozzáadása a beépülő modulhoz (nem kötelező)

A beépülő modul logikáját egyéni konfiguráció hozzáadásával bővítheti:

  1. Örökölje az osztályt. A dev proxy futásidejű elemezett beépülő modulkonfigurációt tesz elérhetővé a tulajdonságon keresztül.

    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. Hozza létre a projektet.

    dotnet build
    
  3. Frissítse a fájlt, hogy az tartalmazza az új konfigurációt.

    Fájl: 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. Futtassa a fejlesztői proxyt.

    devproxy
    

Lásd még

  • Beépülő modul architektúrája
  • Előre beállított konfigurációk használata
  • Fejlesztői proxy konfigurálása