Подтвердить что ты не робот

Изменение объекта ответа из промежуточного ПО OWIN

Мое промежуточное ПО OWIN похоже на это. (Framework - это веб-интерфейс ASP.NET).

public class MyMiddleware : OwinMiddleware
{
    public MyMiddleware(OwinMiddleware next) : base(next) { }

    public override async Task Invoke(OwinRequest request, OwinResponse response)
    {
        var header = request.GetHeader("X-Whatever-Header");

        await Next.Invoke(request, response);

        response.SetHeader("X-MyResponse-Header", "Some Value");
        response.StatusCode = 403;

    }
}

Вопросы:

  • Является ли это рекомендуемой практикой из OwinMiddleware? Я вижу, что в источнике Katana некоторые из классов промежуточного ПО получают из OwinMiddleware, а некоторые нет.

  • Я вижу заголовки запросов в порядке. Настройка заголовка ответа или кода состояния после Next.Invoke в моем промежуточном программном обеспечении не влияет на ответ, возвращаемый клиенту. Но если я устанавливаю заголовок ответа или статус перед вызовом Next.Invoke, ответ с заголовками и статус, который я устанавливаю, возвращается клиенту. Каков правильный способ их настройки?

4b9b3361

Ответ 1

  • Да, рекомендуется использовать OwinMiddleware. Причина, по которой некоторые классы промежуточного ПО не выводятся из OwinMiddleware, заключается в том, что они еще не переключились, потому что класс был введен недавно. Или, чтобы не допустить, чтобы сборка зависела от сборки Microsoft.Owin по какой-либо причине.

  • Вероятная причина, устанавливающая материал в ответе после вызова Invoke on Next, не работает, так это то, что HTTP-заголовок ответа отправляется, как только кто-либо начинает писать поток тела ответа. Таким образом, любые изменения в коде состояния или заголовках HTTP после того, как компонент промежуточного программного обеспечения начнет писать тело ответа, не будет иметь никакого эффекта.

Что вы можете попробовать сделать, это использовать обратный вызов OnSendingHeaders, который предоставляет OWIN. Вот как вы можете его использовать:

public override async Task Invoke(IOwinContext context)
{
   var response = context.Response;
   var request =  context.Request;

   response.OnSendingHeaders(state =>
   {
       var resp = (OwinResponse)state;
       resp.Headers.Add("X-MyResponse-Header", "Some Value");
       resp.StatusCode = 403;
       resp.ReasonPhrase = "Forbidden";
    }, response);

  var header = request.Headers["X-Whatever-Header"];

  await Next.Invoke(context);
}

Приобретите biscuit314 для обновления моего ответа.

Ответ 2

Я попытался отредактировать Youssef отличный ответ, чтобы исправить незначительную ошибку и обновить пример с тем, как работает OwinMiddleware.

Редактирование было отклонено (ну, одобрено одним, отклонено одним за слишком незначительное и отклонено двумя за слишком большое значение).

Вот эта версия кода Youssef:

public override async Task Invoke(IOwinContext context)
{
  var response = context.Response;
  var request =  context.Request;

  response.OnSendingHeaders(state =>
    {
        var resp = (OwinResponse)state;
        resp.Headers.Add("X-MyResponse-Header", "Some Value");
        resp.StatusCode = 403;
        resp.ReasonPhrase = "Forbidden"; // if you're going to change the status code
                                         // you probably should also change the reason phrase
    }, response);

  var header = request.Headers["X-Whatever-Header"];

  await Next.Invoke(context);
}