如何在 OnResultExecuted 中添加 header
How can I add a header in OnResultExecuted
我需要在回复中添加 header。
header 值基于响应 body。
当我尝试添加 header 时出现错误:'Headers are read-only, response has already started.'
public class SecurityFilter : ActionFilterAttribute
{
public override async void OnActionExecuting(ActionExecutingContext context)
{
var body = await new StreamReader(context.HttpContext.Request.Body).ReadToEndAsync();
}
public override void OnResultExecuted(ResultExecutedContext context)
{
var objectResult = context.Result as ObjectResult;
var resultValue = objectResult.Value;
Console.WriteLine(resultValue);
context.HttpContext.Response.Headers.Add("foo", "bar");
base.OnResultExecuted(context);
}
}
OnResultExecuted
方法在操作结果执行后被调用。如果结果已经完成,响应头不能是set/modified。
您可以使用 OnActionExecuted
方法,该方法在操作执行之后、操作结果之前调用。或者使用在操作结果执行之前调用的 OnResultExecuting
方法。
这是一个您可以遵循的简单演示:
public class SecurityFilter : ActionFilterAttribute
{
public override async void OnActionExecuting(ActionExecutingContext context)
{
}
public override void OnActionExecuted(ActionExecutedContext context)
{
var objectResult = context.Result as ObjectResult;
var resultValue = objectResult.Value;
Console.WriteLine(resultValue);
context.HttpContext.Response.Headers.Add("foo", "bar");
base.OnActionExecuted(context);
}
}
我需要在回复中添加 header。
header 值基于响应 body。
当我尝试添加 header 时出现错误:'Headers are read-only, response has already started.'
public class SecurityFilter : ActionFilterAttribute
{
public override async void OnActionExecuting(ActionExecutingContext context)
{
var body = await new StreamReader(context.HttpContext.Request.Body).ReadToEndAsync();
}
public override void OnResultExecuted(ResultExecutedContext context)
{
var objectResult = context.Result as ObjectResult;
var resultValue = objectResult.Value;
Console.WriteLine(resultValue);
context.HttpContext.Response.Headers.Add("foo", "bar");
base.OnResultExecuted(context);
}
}
OnResultExecuted
方法在操作结果执行后被调用。如果结果已经完成,响应头不能是set/modified。
您可以使用 OnActionExecuted
方法,该方法在操作执行之后、操作结果之前调用。或者使用在操作结果执行之前调用的 OnResultExecuting
方法。
这是一个您可以遵循的简单演示:
public class SecurityFilter : ActionFilterAttribute
{
public override async void OnActionExecuting(ActionExecutingContext context)
{
}
public override void OnActionExecuted(ActionExecutedContext context)
{
var objectResult = context.Result as ObjectResult;
var resultValue = objectResult.Value;
Console.WriteLine(resultValue);
context.HttpContext.Response.Headers.Add("foo", "bar");
base.OnActionExecuted(context);
}
}