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


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

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.

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 dotnet new classlib paranccsal.

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

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

  4. Adja hozzá a DevProxy.Abstractions.dll elemet hivatkozásként a projekt DevProxyCustomPlugin.csproj 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 DLL-eket a build kimenetéből, ha hozzáad egy címkét ExcludeAssetsPackageReference a DevProxyCustomPlugin.csproj fájlhoz.

    <ExcludeAssets>runtime</ExcludeAssets>
    
  7. Hozzon létre egy új osztályt, amely az BaseProxy 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)
        {
            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 devproxyrc.json fájlhoz.

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

    devproxy
    

A példa beépülő modul ellenőrzi a szükséges Authorization 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 BasePlugin<TConfiguration> osztályt. A dev proxy futásidejű elemezett beépülő modulkonfigurációt tesz elérhetővé a Configuration 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(
        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;
        }
    }
    
  2. Hozza létre a projektet.

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

    {
      "plugins": [{
        "name": "CatchApiCallsPlugin",
        "enabled": true,
        "pluginPath": "./bin/Debug/net9.0/MyCustomPlugin.dll",
        "configSection": "catchApiCalls"
      }],
      "catchApiCalls": {
        "requiredHeader": "Authorization" // Example configuration
      }
    }
    
  4. Futtassa a fejlesztői proxyt.

    devproxy