[Перевод] Начинаем делать RESTful web-сервисы на WCF и Nelibur

WCF — реально мощная штука, но раз за разом для новых проектов мы вынуждены создавать новые, похожие друг на друга веб-сервисы. В этой статье (переводе) мы увидем, как создать повторно используемый веб-сервис с помощью Nelibur. Nelibur — это Message based web service framework на чистом WCF. Давайте посмотрим, как начать создание web-сервисов на WCF с использованием Nelibur.Шаг 1. Создание приложенияДля простоты хостить WCF-сервис будет консольное приложение. Так что просто добавляем новый консольный проект.dedde167cdd12e84088eb47e70612240.jpgШаг 2. Инсталлируем Nelibur Самый простой способ установить Nelibur — воспользоваться NuGet package manager.5f8cc0ac2e24483475be7497e6f07b46.jpgТо же самое можно сделать с помощью Package Manager Consolec5afb3b0810a03d138f8b67f18e517aa.png

Теперь мы готовы создать RESTful WCF message based сервис.

Шаг 3. Создаем WCF-сервис Для примера, возмем следующие требования к WCF-сервису: Nelibur уже содержит нужную нам реализацию: JsonServicePerCall.Итак, добавляем код запуска нашего сервиса. internal class Program { private static WebServiceHost _service;

private static void Main () { _service = new WebServiceHost (typeof (JsonServicePerCall)); _service.Open ();

Console.WriteLine («ShipTrackingService is running»); Console.WriteLine («Press any key to exit\n»);

Console.ReadKey (); _service.Close (); } } Прописываем конфигурацию Реализуем бизнес-логику Наш сервис должен уметь: Добавлять корабль Получать корабль по ShipId Создаем команду AddShipCommand public sealed class AddShipCommand { public string ShipName { get; set; } } Результатом выполнения команды должен стать объект ShipInfo public sealed class ShipInfo { public Guid Id { get; set; } public string Name { get; set; } } Добавляем запрос ShipLocationQuery, результатом выполнения которого должен быть объект ShipLocation public sealed class ShipLocationQuery { public Guid ShipId { get; set; } } public sealed class ShipLocation { public string Location { get; set; } public Guid ShipId { get; set; } } Теперь нам нужно сделать обработчик команды и запроса public sealed class ShipProcessor: IPost, IGet { private static readonly Dictionary _ships = new Dictionary();

public object Get (ShipLocationQuery request) { if (_ships.ContainsKey (request.ShipId)) { return new ShipLocation { Location = «Sheldonopolis», ShipId = request.ShipId }; } throw new WebFaultException (HttpStatusCode.BadRequest); }

public object Post (AddShipCommand request) { var ship = new Ship (request.ShipName, Guid.NewGuid ()); _ships[ship.Id] = ship; return new ShipInfo { Id = ship.Id, Name = ship.Name }; } } Связываем команду и запрос с обработчиком internal class Program { private static WebServiceHost _service;

private static void ConfigureService () { NeliburRestService.Configure (x => { x.Bind(); x.Bind(); }); }

private static void Main () { ConfigureService ();

_service = new WebServiceHost (typeof (JsonServicePerCall)); _service.Open ();

Console.WriteLine («ShipTrackingService is running»); Console.WriteLine («Press any key to exit\n»);

Console.ReadKey (); _service.Close (); } } Все, сервис закончен. Как вы заметили, вы можете добавлять любые операции без изменения WCF-сервиса…Клиент, использующий наш WCF-сервис В качестве клиента можно использовать: Fiddler Добавление нового корабля (с помощью POST-запроса): 198c56e587dd03fe8f009945bf446358.jpgПолучение корабля по ShipId (с помощью GET-запроса): 640e1f700112a505c62c5e6fb92dda1b.jpg

JsonServiceClient Для создания своего клиента — добавляем еще одно консольное приложение.Вот код клиента: internal class Program { private static void Main () { var client = new JsonServiceClient (Settings.Default.ServiceAddress); var shipInfo = client.Post(new AddShipCommand { ShipName = «Star» }); Console.WriteLine («The ship has added: {0}», shipInfo);

var shipLocation = client.Get(new ShipLocationQuery { ShipId = shipInfo.Id }); Console.WriteLine («The ship {0}», shipLocation);

Console.ReadKey (); } } Запускаем наш клиент и видим результат выполнения: На стороне сервиса4b1f9ddfdb268e7561708876a3af03dc.jpg

На стороне клиентаb2f10deed743abb758589cca98720e04.jpg

Дополнительная литература Вот и все Я надеюсь, вам понравилось. Спасибо за чтение статьи (перевода).Исходники можно скачать с оригинала.

© Habrahabr.ru