在C#中,API拦截通常涉及到对HTTP请求和响应的监控、修改或处理,以下是一些常见的方法和工具,用于在C#中实现API拦截:
一、使用HttpClientHandler
1、原理:HttpClientHandler
是HttpClient
类的一个核心组件,它负责处理底层的HTTP请求和响应,通过继承HttpClientHandler
并重写其方法,可以实现对HTTP请求和响应的拦截。
2、示例代码
public class CustomHttpClientHandler : HttpClientHandler { protected override Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken) { // 在发送请求之前可以修改请求 request.Headers.Add("Custom-Header", "MyValue"); // 调用基类的SendAsync方法发送请求 var response = base.SendAsync(request, cancellationToken).GetAwaiter().GetResult(); // 在接收到响应之后可以修改响应 if (response.StatusCode == System.Net.HttpStatusCode.OK) { var content = response.Content.ReadAsStringAsync().GetAwaiter().GetResult(); response.Content = new StringContent(content.ToUpper()); // 示例:将响应内容转换为大写 } return response; } } public class Program { public static async Task Main() { var handler = new CustomHttpClientHandler(); var client = new HttpClient(handler); var request = new HttpRequestMessage(HttpMethod.Get, "https://jsonplaceholder.typicode.com/posts/1"); var response = await client.SendAsync(request); var responseContent = await response.Content.ReadAsStringAsync(); Console.WriteLine(responseContent); } }
3、优缺点
优点:实现相对简单,可以直接在代码中对请求和响应进行自定义的处理,适用于对特定请求和响应的拦截和修改。
缺点:需要手动创建和配置HttpClientHandler
,并且在处理复杂的逻辑时可能会使代码变得复杂。
二、使用DelegatingHandler
1、原理:DelegatingHandler
是一个抽象类,它可以用于创建自定义的HTTP消息处理器,通过继承DelegatingHandler
并重写其SendAsync
方法,可以实现对HTTP请求和响应的拦截。
2、示例代码
public class LoggingHandler : DelegatingHandler { protected override async Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken) { // 记录请求信息 Console.WriteLine($"Request: {request.Method} {request.RequestUri}"); // 调用内层处理器发送请求 var response = await base.SendAsync(request, cancellationToken); // 记录响应信息 Console.WriteLine($"Response: {response.StatusCode}"); return response; } } public class Program { public static async Task Main() { var loggingHandler = new LoggingHandler(); var httpClient = HttpClientFactory.Create(new HttpClientHandler()); httpClient.DefaultRequestVersion = HttpVersion.Version11; httpClient.DefaultProxyCredentials = CredentialCache.DefaultCredentials; var handler = new HttpClientHandler(); var client = new HttpClient(loggingHandler, handler); var request = new HttpRequestMessage(HttpMethod.Get, "https://jsonplaceholder.typicode.com/posts/1"); var response = await client.SendAsync(request); var responseContent = await response.Content.ReadAsStringAsync(); Console.WriteLine(responseContent); } }
3、优缺点
优点:可以方便地插入到HTTP请求和响应的处理管道中,能够灵活地组合多个处理器来实现不同的功能,如日志记录、身份验证、请求修改等。
缺点:对于简单的拦截需求,可能会显得有些繁琐,需要额外的配置和理解。
三、使用Action Filter(针对ASP.NET Core Web API)
1、原理:在ASP.NET Core Web API中,可以使用Action Filter来拦截和处理HTTP请求和响应,Action Filter可以在请求到达控制器方法之前或响应返回给客户端之前执行自定义的逻辑。
2、示例代码
using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc.Filters; using System.Threading.Tasks; public class CustomActionFilter : IActionFilter { public void OnActionExecuting(ActionExecutingContext context) { // 在请求处理之前执行的逻辑,例如记录请求信息、修改请求参数等 context.ActionArguments["param"] = "NewValue"; } public void OnActionExecuted(ActionExecutedContext context) { // 在请求处理之后执行的逻辑,例如记录响应信息、修改响应内容等 context.HttpContext.Response.OnStarting(state => { var response = state as HttpResponse; response.Content = new StringContent("Modified Response"); return Task.CompletedTask; }, context.HttpContext.Response); } } [AttributeUsage(AttributeTargets.Class | AttributeTargets.Method)] public class CustomActionFilterAttribute : Attribute { public CustomActionFilterAttribute() : base() { } } [ApiController] [Route("[controller]")] public class TestController : ControllerBase { [HttpGet] [CustomActionFilter] public IActionResult Get() { return Ok("Original Response"); } }
3、优缺点
优点:与ASP.NET Core的管道集成紧密,可以方便地在整个应用程序中应用拦截逻辑,并且可以利用ASP.NET Core提供的各种特性和功能。
缺点:只能在ASP.NET Core Web API项目中使用,对于其他类型的C#应用程序不适用。
在C#中实现API拦截有多种方法可供选择,每种方法都有其特点和适用场景,开发人员可以根据具体的需求和项目情况选择合适的拦截方式,以实现对API请求和响应的有效监控和处理。