2015-05-20 5 views
3

В моем приложении OWIN я регистрирую промежуточное программное обеспечение, чтобы перехватить результат других промежуточных продуктов в конвейере, и если условие выполнено, мне нужно полностью изменить ответ от того, что он есть (может быть 302 или 200) до 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

Вы должны вызвать Next.Invoke, только если someCondition (context) является false. Я думаю, вы найдете 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); 
... 
Смежные вопросы