2015-05-20 29 views
3

的反应在我的OWIN的应用程序,我注册了一个中间件下来拦截其他中间件成果的管道,如果条件满足,我需要完全改变从不管它是响应(可能是302200)至403(禁止)。改写Owin中间件

有一个不是很干净的方式,那就是手动清除所有标头,内容类型等,并将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

只有当someCondition(context)为false时,您才应该调用Next.Invoke。我想你会发现this blog post有帮助。

+0

但'somecondition'要看什么'Next.Invoke'做的'context' –

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