한눈에 보기
목표: 사용자 지정 개발 프록시 플러그 인 빌드
시간: 30분
플러그인: 사용자 지정 플러그 인
전제 조건: Dev Proxy 설정, .NET 10 SDK
이 문서에서는 개발자 프록시에 대한 사용자 지정 플러그 인을 만드는 방법을 알아봅니다. 개발자 프록시용 플러그 인을 만들어 해당 기능을 확장하고 필요에 맞게 사용자 지정 기능을 추가할 수 있습니다.
HTTP 플러그 인과 stdio 플러그 인 비교
개발자 프록시는 가로채려는 트래픽에 따라 두 가지 유형의 플러그 인을 지원합니다.
HTTP 플러그 인은 앱과 API 간에 HTTP(S) 요청 및 응답을 차단합니다. 다음과 같은 메서드에서 상속하고 재정의합니다. API 오류를 시뮬레이션하거나, 모의 응답을 추가하거나, 요청 헤더의 유효성을 검사하거나, HTTP 트래픽을 검사하고 수정하려는 경우 HTTP 플러그 인을 사용합니다.
Stdio 플러그 인은 부모 프로세스와 자식 프로세스 간에 표준 입력/출력(stdin, stdout, stderr)을 통해 전송된 메시지를 차단합니다. 인터페이스(또한 구현)를 구현 하고 , 및 .와 같은 메서드를 재정의합니다. STDio를 통해 통신하는 도구(예: MCP(모델 컨텍스트 프로토콜) 서버)로 작업할 때 stdio 플러그 인을 사용합니다.
단일 플러그 인 클래스는 두 집합의 메서드를 재정의하여 HTTP 및 stdio 트래픽을 모두 처리할 수 있습니다.
필수 조건
사용자 지정 플러그 인 만들기를 시작하기 전에 다음 필수 구성 요소가 있는지 확인합니다.
- .NET v10 Core SDK
- 개발 프록시 추상화 DLL의 최신 버전은 Dev 프록시 GitHub 릴리스 페이지에서 찾을 수 있습니다.
새 플러그 인 만들기
다음 단계에 따라 새 프로젝트를 만듭니다.
명령을 사용하여 새 클래스 라이브러리 프로젝트를 만듭니다 .
dotnet new classlib -n MyCustomPluginVisual Studio Code 새로 만든 프로젝트를 엽니다.
code MyCustomPlugin프로젝트 폴더에 개발 프록시 추상화 DLL()을 추가합니다.
프로젝트 파일에 대한 참조로 추가합니다.
<ItemGroup> <Reference Include="DevProxy.Abstractions"> <HintPath>.\DevProxy.Abstractions.dll</HintPath> <Private>false</Private> <ExcludeAssets>runtime</ExcludeAssets> </Reference> </ItemGroup>프로젝트에 필요한 NuGet 패키지를 추가합니다.
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파일당 태그를 추가하여 빌드 출력에서 종속성 DLL(동적 연결 라이브러리)을 제외합니다.
<ExcludeAssets>runtime</ExcludeAssets>클래스를 상속하는 새 클래스를 만드십시오.
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; } }프로젝트를 빌드합니다.
dotnet build
사용자 지정 플러그 인 사용
사용자 지정 플러그 인을 사용하려면 개발자 프록시 구성 파일에 추가해야 합니다.
파일에 새 플러그 인 구성을 추가합니다 .
파일: devproxyrc.json
{ "plugins": [{ "name": "CatchApiCallsPlugin", "enabled": true, "pluginPath": "./bin/Debug/net10.0/MyCustomPlugin.dll", }] }개발 프록시를 실행합니다.
devproxy
예제 플러그 인은 필요한 헤더에 대해 일치하는 모든 URL을 확인합니다. 헤더가 없으면 경고 메시지가 표시됩니다.
플러그 인에 사용자 지정 구성 추가(선택 사항)
사용자 지정 구성을 추가하여 플러그 인의 논리를 확장할 수 있습니다.
클래스에서 상속합니다. 개발 프록시는 속성을 통해 런타임 중 구문 분석된 플러그인 구성을 노출합니다.
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; } }프로젝트를 빌드합니다.
dotnet build새 구성을 포함하도록 파일을 업데이트합니다 .
파일: 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" } }개발 프록시를 실행합니다.
devproxy
참고하십시오
- 플러그 인 아키텍처
- 미리 설정된 구성 사용
- 개발 프록시 구성
Dev Proxy