安装包
学习交流群
https://download.csdn.net/download/weixin_43958365/88282794?spm=1001.2014.3001.5503
实现
[HttpPost("/my-endpoint")]
[Authorize(Roles = "Admin,Manager")]
[PreProcessor<MyRequestLogger<MyRequest>>]
[PostProcessor<MyResponseLogger<MyRequest, MyResponse>>]
[Throttle(
hitLimit: 120,
durationSeconds: 60,
headerName: "X-Client-Id" // this is optional
)]//速率限制
public class GetArticleEndpointF : Endpoint<MyRequest, MyResponse>
{
private readonly ISender _sender;
public GetArticleEndpointF(ISender sender)
{
_sender=sender;
}
public async override Task<IResult> HandleAsync(MyRequest req, CancellationToken ct)
{
var query = new GetArticle.ArticleRequest { Id = req.Id };
var result = await _sender.Send(query);
return Results.Ok(result);
}
}
public class MyRequest
{
public Guid Id { get; set; }
public string FirstName { get; set; } = string.Empty;
public string LastName { get; set; } = string.Empty;
public int Age { get; set; }
}
public class MyResponse
{
public string FullName { get; set; } = string.Empty;
public bool IsOver18 { get; set; }
}
前处理器
/// <summary>
/// 前处理器
/// </summary>
/// <typeparam name="TRequest"></typeparam>
public class MyRequestLogger<TRequest> : IPreProcessor<TRequest>
{
public Task PreProcessAsync(IPreProcessorContext<TRequest> ctx, CancellationToken ct)
{
var logger = ctx.HttpContext.Resolve<ILogger<TRequest>>();
logger.LogInformation(
$"request:{ctx.Request.GetType().FullName} path: {ctx.HttpContext.Request.Path}");
return Task.CompletedTask;
}
}
后处理器
/// <summary>
/// 后处理器
/// </summary>
/// <typeparam name="TRequest"></typeparam>
/// <typeparam name="TResponse"></typeparam>
public class MyResponseLogger<TRequest, TResponse> : IPostProcessor<TRequest, TResponse>
{
public Task PostProcessAsync(IPostProcessorContext<TRequest, TResponse> context, CancellationToken ct)
{
throw new NotImplementedException();
}
}