使用C#,NetCore3.1
我想知道是否有人能帮忙。我想添加“中间件”,但我认为我的需求需要一个属性,因为我只想对特定的API操作有选择地这样做。如何在响应发送到请求客户端之前对响应进行某些处理(例如签名消息并将其添加到响应头)?
例如
[HttpGet]
[PostResponseProcessAttribute]
public IActionResult GetFoo(int id) {
return MyFoo();
}
所以对于这个GetFoo动作,我想做这样的事情:
public class PostResponseProcessAttribute : Attribute {
public OnBeforeSendingResponse(){
var response = Response.Content.ReadAsStringAsync;
//do some stuff
response.Headers.Add(results from stuff)
}
}
它是我需要实现的属性吗?我需要重写的函数是什么?另外,关键的一点是,响应的格式和状态将发送给客户端(即传递给其他格式化中间件处理等)--这对于签名非常重要,因为任何差异都意味着客户端正在验证不同版本的响应,因此总是失败。
谢谢
发布于 2020-10-01 16:35:32
最后,我写到:
public sealed class AddHeadersRequiredAttribute : Attribute
{
}
public class AddHeadersMiddleware
{
private readonly RequestDelegate _next;
public AddHeadersMiddleware(RequestDelegate next)
{
_next = next;
}
public async Task Invoke(HttpContext context)
{
await using var memory = new MemoryStream();
var originalStream = context.Response.Body;
context.Response.Body = memory;
await _next(context);
memory.Seek(0, SeekOrigin.Begin);
var content = await new StreamReader(memory).ReadToEndAsync();
memory.Seek(0, SeekOrigin.Begin);
// Now you can manipulate with content
var attribute = GetAddHeadersRequiredAttributeFromMatchedAction(context);
if (attribute != null)
context.Response.Headers.Add("X-Header-1", content);
await memory.CopyToAsync(originalStream);
context.Response.Body = originalStream;
}
private Attribute GetAddHeadersRequiredAttributeFromMatchedAction(HttpContext context)
{
var endpoint = context.GetEndpoint();
var controllerActionDescriptor = endpoint?.Metadata.GetMetadata<ControllerActionDescriptor>();
return controllerActionDescriptor?.MethodInfo.GetCustomAttribute<AddHeadersRequiredAttribute>();
}
}
您可以使用AddHeadersRequiredAttribute
标记控制器方法。然后在Startup.Configure
方法中使用中间件,如下所示
app.UseMiddleware<AddHeadersMiddleware>();
https://stackoverflow.com/questions/64158823
复制相似问题