重写Owin Middleware中的响应

时间:2015-05-20 10:36:06

标签: c# asp.net owin middleware

在我的OWIN应用程序中,我注册了一个中间件来拦截管道中其他中间件的结果,如果满足条件,我需要完全改变它的响应(可能是302200403(禁止)。

当然有一种不太干净的方式,即手动清除所有标题,内容类型等,并将statusCode设置为403,但这对我来说是错误的方法。

public override async Task Invoke(IOwinContext context)
{
    await this.Next.Invoke(context);

    if (someCondition(context))
    {
        var headers = context.Response.Headers;
        headers.Keys.ForEach(k => headers.Remove(k));
        context.Response.StatusCode = 403;
        context.Response.ContentType = string.Empty;
        context.Response.ContentLength = null;
        await context.Response.WriteAsync(string.Empty);
    }
}

此外,当覆盖200响应时(当它到达我们设置StatusCode的行时,此方法不起作用,它会跳出并刷新响应)。

我是OWIN的新手,我可能误解了它的工作方式。

还有其他方法吗?

1 个答案:

答案 0 :(得分:2)

这是我发现的。

如果在到达控制器后尝试更改响应标头,则可能已经发送了标头。

这就是为什么你应该在继续管道之前订阅OnSendingHeaders(Action<object> callback, object state)

示例:

...
context.Response.OnSendingHeaders(obj => { /* Do stuff */ }, new object());
// Then call the next middleware
await this.Next.Invoke(context);
...