2013-11-13 4 views
12

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

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

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

ответ

3

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

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

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); 
    } 
} 
Смежные вопросы