Во второй части посмотрим насколько просто создать WebAPI приложение на базе OWIN.
Необходимо отметить, что разработчики Katana вместо базовых типов и интерфейсов используют соглашения. Они обещали, что многие из них будут переопределяемы. Но сейчас не будем углубляться в их детали и воспользуемся именами и значениями по умолчанию.
Подготавливаем проект
Итак, задача – создать приложение, использующее WebAPI. В качестве сервера выберем IIS, поэтому создадим пустой веб-проект (ASP.NET Empty Web Application). Это не принципимально для Katana, но позволит сразу получить проект с подключенной System.Web и настроенным для отладки IIS Express. Создаваемое решение назовем OwinWebAPIDemo.
С помощью NuGet (Package Manager Console) установим библиотеку WebAPI для OWIN:
PM> Install-Package Microsoft.AspNet.WebApi.Owin -Prerelease
Сборки Katana (реализация спецификации OWIN от Microsoft) будут добавлены в проект автоматически. Поскольку они не зависят от типа сервера, то необходимо также подключить библиотеку, реализующую OWIN для IIS (другие варианты рассмотрим в следующей части):
PM> Install-Package Microsoft.Owin.Host.SystemWeb
Подготовка проекта завершена. Теперь самое время рассмотреть первое из соглашений Katana.
Соглашение для конфигурации конвейера обработки сообщений
При запуске веб-приложения, Katana ищет класс Startup и вызывает его метод Configuration() для создания и настройки конвейера обработки сообщений:
public class Startup
{
public void Configuration(IAppBuilder appBuilder)
{
// создание, конфигурация и установка модулей для конвейера
}
}
Интерфейс IAppBuilder используется для указания используемых модулей. Для этого необходимо передать их в качестве параметра appBuilder.Use(). Однако, библиотека Microsoft.AspNet.WebApi.Owin добавляет свой метод-расширение UseWebApi(), что упрощает её подключение.
Как и в обычном веб-приложении, требуется создать конфигурацию для корректной работы WebAPI. Поэтому создадим переменную config и определим очень простой путь "{controller}". В итоге, добавим в проект класс Startup со следующим кодом:
namespace OwinWebAPIDemo
{
using System.Web.Http;
using Owin;
public class Startup
{
public void Configuration(IAppBuilder appBuilder)
{
var config = new HttpConfiguration();
config.Routes.MapHttpRoute("default", "{controller}");
appBuilder.UseWebApi(config);
}
}
}
Предположим, что в приложении потребовалось использовать несколько модулей. Тогда после UseWebApi() для них расположились бы вызовы Use() или других методов-расширений. Их порядок определяет очередность, в которой происходит обработка запроса и формирование ответа. Как можно заметить, все достаточно легко и понятно.
Работаем с WebAPI
Остается добавить Контроллер. Для этого создадим папку Controllers и в ней разместим HomeController. Пусть он возвращает 10 целых чисел, начиная с нуля:
namespace OwinWebAPIDemo.Controllers
{
using System.Collections.Generic;
using System.Linq;
using System.Web.Http;
public class HomeController : ApiController
{
public IEnumerable<int> GetValues()
{
return Enumerable.Range(0, 10);
}
}
}
Запустим полученное приложение и обратимся по пути
http://localhost:[ваш порт]/Home
Ответом будет json c массивом чисел: [0,1,2,3,4,5,6,7,8,9]. Если воспользоваться, например, Fiddler и добавить в запрос заголовок Accept: application/xml, то сервер вернет результат в XML.
Можно отметить, что созданное веб-приложение получилось даже проще, чем его аналог на стандартном шаблоне WebAPI.
В следующей части разберемся с некоторыми деталями работы Katana более детально. В частности напишем собственный модуль и поменяем тип сервера с IIS на самостоятельное приложение (self-host).