Преимущества использования пакетов OWIN в приложении MVC5

Я пытаюсь понять OWIN и Katana.. конечно, здорово, что приложение может быть самообслуживанием или может быть размещено на Нэнси или на не-IIS. Причина этого вопроса заключается в том, что мы хотим создать веб-приложение с использованием MVC5 (VS 2013), которое будет размещено в IIS в Windows Azure.

Однако мы получили рекомендацию использовать компоненты промежуточного программного обеспечения OWIN в приложении mvc5, чтобы получить преимущества подключаемой архитектуры, производительности и т.д.

Я хотел бы понять, как будет достигнуто увеличение производительности, если мы будем использовать промежуточное ПО OWIN в приложении MVC5, которое будет размещено в IIS в Windows Azure. Будет ли мое приложение пропускать много ненужных вещей в трубе IIS, используя пакеты промежуточного программного обеспечения owin? Есть ли другие преимущества, которые я могу получить, используя OWIN в MVC5, когда он размещен в IIS?

Ответ 1

Да, вы потенциально сможете пропустить много ненужных вещей в конвейере, поскольку вы определите компоненты в конвейере вместе с другими компонентами, которые не обязательно сделаны вами, что ваше приложение будет использовать. Эти компоненты являются промежуточным программным обеспечением, поскольку они находятся в середине конвейера обработки, и компоненты могут решить передать управление следующему компоненту в конвейере с помощью синтаксиса async/await С# или завершить обработку этого компонента.

Объект AppFunc - это место, где "магия" происходит в Катане, потому что это логика, которую компонент использует при ее вызове, подпись такова:

Func<IDictionary<string, object>, Task>;

Примечание: IDictionary<string, object> представляет значения среды (например, Request и Response; думаю HttpContext в ASP.NET), а стандарт OWIN определяет определенные значения, которые должны существовать в этом словаре, например "owin.RequestBody" или "owin.ResponseBody". Katana - это реализация Microsoft стандарта OWIN и, как таковая, и другие словарные элементы доступны из коробки.


Примером компонента может быть метод, который соответствует сигнатуре AppFunc (который равен Func<IDictionary<string, object>, Task>, например:

public async Task Invoke(IDictionary<string, object> environment)
{
    // Do processing...

    // Wait for next component to complete
    await _nextComponent(environment);

    // Do more processing...
}

Примечание. OWIN ожидает, что метод вернет Task или сгенерирует исключение, поэтому return null; будет недействительным.


Итак, как вы узнаете, каким будет следующий компонент?

Конструктор вашего компонента должен принять параметр Func<IDictionary<string, object>, Task>, например:

public class HelloWorldCOmponent
{
    Func<IDictionary<string, object>, Task> _next;

    public HelloWorldComponent(Func<IDictionary<string, object>, Task> next)
    {
        _next = next;
    }

    public async Task Invoke(IDictionary<string, object> environment)
    {
        // Do something

        // Wait for next component to return
        await _next(environment);
    }
}