OWIN и Katana

Введение в OWIN и Katana

Данное руководство устарело. Актуальное руководство: Руководство по ASP.NET Core

Последнее обновление: 31.10.2015

Одним из нововведений в .NET 4.5.1 стало внедрение спецификации OWIN и проекта Katana. Благодаря этим нововведениям становятся доступными новые способы построения веб-приложений. Рассмотрим, что они представляют.

OWIN или Open Web Interface for .NET представляет собой спецификацию, определяющую взаимодействие между веб-приложением и веб-сервером. Современным веб-приложениям требуется больше гибкости. И ответом на эти вызовы стало появление спецификации OWIN.

Но OWIN - это спецификация, которая создавалась как открытый проект вне стен Microsofta. Непосредственной реализацией этой спецификации стал проект Katana.

Всю архитектуру проекта Katana можно представить следующим образом:

Архитектура Katana и OWIN

Рассмотрим основные слои этой архитектуры:

  • Хост: процесс, который обрабатывает приложение. Если в качестве сервера приложения используется IIS, то подобным процессом является процесс самого сервера IIS. Однако им может быть и сам файл приложения. Основная его задача - запуск, загрузка компонентов OWIN и корректное завершение.

  • Сервер: реализует спецификацию OWIN, выполняет наполнение словаря окружения из данных запроса и обрабатывает запрос на конвейере OWIN.

  • Промежуточное ПО или слой Middleware: набор компонентов, обрабатывающих запросы в конвейере OWIN.

  • И само приложение, выполняющее определенную задачу.

Что нам дает использование Katana в своих проектах? Katana позволяет создавать приложение, использующее различные веб-технологии, и запускать его где угодно. Посмотрим на простом примере.

В Visual Studio 2013 создадим новое приложение. В моем случае оно будет называться KatanaApp. В качестве шаблона приложения выберем шаблон Empty:

Создание проекта Katana и OWIN

Итак, Visual Studio создаст абсолютно пустой проект. Функционал инфраструктуры OWIN содержится в библиотеке Microsoft.Owin.Host.SystemWeb. Для добавления библиотеки в проект воспользуемся менеджером NuGet:

Теперь добавим в проект класс запуска OWIN. Все приложения OWIN должны иметь подобный класс, в котором определяются компоненты конвейера приложения. Есть различные способы определения данного класса. Мы воспользуемся самым простым - просто добавим в проект соответствующий класс. Для этого нажмем правой кнопкой мыши на проект в окне Solution Explorer, в появившемся меню выберем Add->New Item... и в окне добавления нового компонента выберем OWIN Startup class:

OWIN Startup class

Теперь изменим добавленный класс следующим образом:

using System;
using System.Threading.Tasks;
using Microsoft.Owin;
using Owin;

[assembly: OwinStartup(typeof(KatanaApp.Startup1))]

namespace KatanaApp
{
    public class Startup1
    {
        public void Configuration(IAppBuilder app)
        {
            app.Run(context => 
            {
                context.Response.ContentType = "text/html; charset=utf-8";
                return context.Response.WriteAsync("<h2>Привет мир!</h2>");
            });
        }
    }
}

Во-первых, чтобы приложение знало, где у нас находится класс OWIN Startup, мы используем атрибут [assembly: OwinStartup(typeof(KatanaApp.Startup1))]. Так, теперь оно знает, что таковым классом является KatanaApp.Startup1.

Этот класс содержит один метод Configuration, который в качестве параметра принимает интерфейс IAppBuilder. Этот интерфейс и является тем промежуточным слоем middleware, который участвует в обработке запросов. Для обработки запроса объект IAppBuilder выполняет функцию Run, которая имеет в качестве параметра делегат Func<IOwinContext,Task>. С помощью объекта context.Response создаем ответ и посылаем его клиенту.

При запуске мы увидим в браузере нашу строку:

В данном случае в качестве веб-сервера выступил IIS, он же выступает в качестве хоста. Однако одной из сторон проекта Katana и OWIN является то, что приложение само будет выступать и в качестве хоста, и в качестве сервера.

В основе такой организации лежит класс HttpListener, который может прослушивать входящие http-запросы и отвечать на них. То есть фактически может выступать в качестве веб-сервера. И хотя мы в большей степени говорим о веб-приложениях в рамках ASP.NET MVC, но чтобы посмотреть преимущества OWIN, создадим простое консольное приложение в Visual Studio, например, в Visual Studio 2013 for Desktop.

Вначале добавим через NuGet библиотеку Microsoft.Owin.SelfHost:

Теперь добавим в консольное приложение вышеопределенный класс Startup1 (не забывая изменить пространство имен класса на пространство имен нашего приложения). И изменим код класса Program следующим образом:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace KatanaConsoleApp
{
    class Program
    {
        static void Main(string[] args)
        {
            using (Microsoft.Owin.Hosting.WebApp.Start<Startup1>("http://localhost:8000"))
            {
                Console.WriteLine("Сервер запущен. Нажмите любую клавишу для завершения работы...");
                Console.ReadLine();
            }
        }
    }
}

Теперь мы можем запустить приложение. Оно будет фактически работать как веб-сервер на 8000 порту, и в браузере мы можем обратиться к нему, набрав в адресной строке http://localhost:8000.

OWIN и Katana в проектах MVC 5

Мы рассмотрели общую концепцию проектов OWIN и Katana, но как же они применяются в MVC 5? При создании проекта ASP.NET MVC 5, использующего идентификацию пользователей, мы сможем заметить применение OWIN и Katana в приложении:

Во-первых, так как проект использует Katana, то в нем имеется файл Startup.cs с одноименным классом:

using Microsoft.Owin;
using Owin;

[assembly: OwinStartupAttribute(typeof(IdentityMvc.Startup))]
namespace IdentityMvc
{
    public partial class Startup
    {
        public void Configuration(IAppBuilder app)
        {
            ConfigureAuth(app);
        }
    }
}

Этот тот же класс, что мы рассматривали ранее, только в данном случае он частичный (partial) и вызывает метод ConfigureAuth. Этот метод определен в другом файле - в файле Startup.Auth.cs, который находится в папке App_Start. В этом файле также находится определение частичного класса Startup:

using Microsoft.AspNet.Identity;
using Microsoft.Owin;
using Microsoft.Owin.Security.Cookies;
using Owin;

namespace IdentityMvc
{
    public partial class Startup
    {
        public void ConfigureAuth(IAppBuilder app)
        {
            app.UseCookieAuthentication(new CookieAuthenticationOptions
            {
                AuthenticationType = DefaultAuthenticationTypes.ApplicationCookie,
                LoginPath = new PathString("/Account/Login")
            });
            app.UseExternalSignInCookie(DefaultAuthenticationTypes.ExternalCookie);

            //app.UseMicrosoftAccountAuthentication(
            //    clientId: "",
            //    clientSecret: "");

            //app.UseTwitterAuthentication(
            //   consumerKey: "",
            //   consumerSecret: "");

            //app.UseFacebookAuthentication(
            //   appId: "",
            //   appSecret: "");

            //app.UseGoogleAuthentication();
        }
    }
}

В методе ConfigureAuth производится аутентификация с помощью куки. По закомментированным строкам вы можете увидеть, что с помощью OWIN производится аутентификация с помощью внешних сервисов, таких как facebook, twitter и др. Кроме того, как мы дальше увидим, вся базовая система аутентификации и авторизации AspNet Identity базируется на компонентах OWIN и Katana.

Помощь сайту
Юмани:
410011174743222
Перевод на карту
Номер карты:
4048415020898850