在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 }
这里为了演示请求和相应头的功能,自定义了一个HttpTransformer,代码如下。

1 private class CustomTransformer : HttpTransformer 2 { 3 public override async Task TransformRequestAsync(HttpContext httpContext, 4 HttpRequestMessage proxyRequest, string destinationPrefix) 5 { 6 // Copy headers normally and then remove the original host. 7 // Use the destination host from proxyRequest.RequestUri instead. 8 await base.TransformRequestAsync(httpContext, proxyRequest, destinationPrefix); 9 proxyRequest.Headers.Host = null; 10 } 11 }
上述代码本身是实现了一个完整的的反向代理的功能的。和目前的主流的反向代理框架比起来,主要缺少一些高级功能,如:路由匹配、负载均衡、会话保持、重试等。但这些高级功能本身不是必须的,这个时候直接用IhttpProxy更加简单直接,也可以方便我们自己构建一个更加灵活高效的反向代理框架。
参考文章: