在YARP框架中,核心处理类是IHttpProxy,其接口定义如下:
Task ProxyAsync(HttpContext context, string destinationPrefix, HttpMessageInvoker httpClient, RequestProxyOptions requestOptions, HttpTransformer transformer)
从它的接口定义基本可以看出它的功能:从 HttpContext 创建 Http 查询信息、发送到目标地址,并将响应结果写会HttpContext。
IhttpProxy特点如下:
-
灵活,能根据请求动态选择代理目标
-
强大,能修改http请求和响应的头
-
支持gRPC或WebSockets这种流式协议
-
支持异常处理
它简单灵活,本身是一个反向代理的功能类的。 用它本身是可以非常简单的实现一个反向代理功能的。代码如下:
1 public void ConfigureServices(IServiceCollection services) 2 { 3 services.AddHttpProxy(); 4 } 5 6 public void Configure(IApplicationBuilder app, IHttpProxy httpProxy) 7 { 8 var httpClient = new HttpMessageInvoker(new SocketsHttpHandler() 9 { 10 UseProxy = false, 11 AllowAutoRedirect = false, 12 AutomaticDecompression = DecompressionMethods.None, 13 UseCookies = false 14 }); 15 var transformer = new CustomTransformer(); // or HttpTransformer.Default; 16 var requestOptions = new RequestProxyOptions { Timeout = TimeSpan.FromSeconds(100) }; 17 18 app.UseRouting(); 19 app.UseAuthorization(); 20 app.UseEndpoints(endpoints => 21 { 22 endpoints.Map("/{**catch-all}", async httpContext => 23 { 24 await httpProxy.ProxyAsync(httpContext, "https://localhost:10000/", httpClient, 25 requestOptions, transformer); 26 27 var errorFeature = httpContext.GetProxyErrorFeature(); 28 if (errorFeature != null) 29 { 30 var error = errorFeature.Error; 31 var exception = errorFeature.Exception; 32 } 33 }); 34 }); 35 }