在我的OWIN应用程序中,我注册了一个中间件来拦截管道中其他中间件的结果,如果满足条件,我需要完全改变它的响应(可能是302
或200
)403
(禁止)。
当然有一种不太干净的方式,即手动清除所有标题,内容类型等,并将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的新手,我可能误解了它的工作方式。
还有其他方法吗?
答案 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);
...