【问题标题】:How can I add a header in OnResultExecuted如何在 OnResultExecuted 中添加标题
【发布时间】:2022-01-18 14:34:29
【问题描述】:

我需要在响应中添加一个标头。

标头值基于响应正文。

当我尝试添加标头时出现错误:'标头是只读的,响应已经开始。'

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);
    }
}

【问题讨论】:

    标签: asp.net-core-webapi


    【解决方案1】:

    OnResultExecuted 方法在动作结果执行后调用。如果结果已经完成,则无法设置/修改响应标头。

    您可以使用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);
        }        
    }
    

    【讨论】:

    • 成功了!谢谢@Rena
    猜你喜欢
    • 2020-07-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-28
    相关资源
    最近更新 更多