Интеграция без папок. Часть первая. Создаем простейший web-сервис

33 4

Представляю вашему вниманию цикл статей, посвященный интеграции DIRECTUM со сторонними системами через web-сервисы.

Мы отправимся в увлекательное путешествие где мы начнем с создания своего сервиса, научимся размещать сервис на IIS, отлаживать сервис, настраивать безопасность, работать с БД, выполнять сериализацицию данных в XML, передавать бинарные данные и то, что возникнет в моей голове по ходу написания статей этого цикла.

Статьи рассчитаны на самых не прокаченных читателей. Я попытаюсь рассказать все простым русским языком с основами, которых мне не хватало при изучении всего того о чем пойдет речь.

В данной статье сделаем первый шаг - научимся писать простейший web-сервис на основе WCF. Windows Communication Foundation (WCF)  это микрософтовская программная платформа, входящая в состав .NET Framework, упрощающая создание сервис-ориентированных приложений.

Для начала определим базовые понятия WCF:

  • Адрес сервиса - ссылка (URL) по которому сообщение будет отправлено на сервис. Например, http://directum.com/WCFServices/HelloService.svc (<транспорт>://<сервер>/<путь до службы>.svc)
  • Привзяка (Binding) - набор настроек, которые детализируют настройки транспорта, шифрования, протокола для клиента который будет взаимодействовать с сервисом в определенной точке подключения  (Endpoint). Примеры привязок: BasicHttpBinding, WSHttpBinding, NetTcpBinding. Например, BasicHttpBinding по умолчанию использует HTTP транспорт для передачи сообщений SOAP 1.1, имеет значения по умолчанию для параметров receiveTimeout, sendTimeout, maxMessageSize и maxBufferSize.
  • Контракт (Contract) - набор спецификаций, которые определяют интерфейсы web-сервиса.
    • Сервисный контракт (service contract) - это интерфейс сервиса. Описывает, что сервис может выполнять.
    • Операционный контракт (operation contract) - часть сервисного контракта, который определяет параметры и типы возвращаемых значений набора операций. Может быть использован нативный тип данных параметра (integer, string и т.д.) или тип данных описанный в договоре о типе данных сообщения (message contract).
    • Контракт сообщения (message contract) - тип данных, который описывается, если операционный контракт содержит сообщение, как параметр операции или возвращаемое значение.
    • Контракт данных (data contract) - это типы данных, используемы в Web-сервисе. Если используемые типы данных нативные, то описывать не обязательно.
    • Контракт ошибок (fault contract) - это описание возможных ошибок, которые могут вернуться клиенту сервиса.
  • Точка подключения (Endpoint) - места откуда сообщение отправляются или куда приходят. Точка подключения аккумулирует всю информацию для обмена сообщениями. У сервиса может быть одна или несколько точек подключения. Сервис может предоставить информацию для обмена сообщениями в форме метаданных, по которым клиент сервиса сгенерирует соответствующую точку подключения и нужный формат сообщения. точка подключения имеет адрес, привязку и сервисный конракт.
  • Поведение (Behavior) - совокупность настроек которое конкретизирует поведение исходя из некоторых входных параметров.
  • Хостинг (Hosting) - сервис WCF не может существовать самостоятельно. Каждая служба WCF должна находиться под управлением некоторого процесса Windows, называемого хостовым процессом. Существуют варианты (мы рассмотрим IIS):
    • Автохостинг (то есть хост-процессом является, к примеру, консольное или графическое Windows приложение)
    • Хостинг в одной из служб Windows
    • Хостинг с использованием IIS (Internet Information Server) или WAS (Windows Activation Services)
  • Метаданные (Metadata) - метаданные сервиса описывают те характеристики сервиса, которые необходимо знать клиенту сервиса, чтобы взаимодействовать с ним. Метаданные, предоставляемые службой, включают в себя XML-документ контракта данных и WSDL-документ, который описывает методы сервиса. 

Для разработки web-сервиса на основе WCF нам понадобится 

  • Microsoft .NET Framework 4.5.1
  • Microsoft Visual Studio 2008-2013 Ultimate, Premium, or Professional
  • Microsoft SQL Server 2012, 2008, 2005, or Express
  • Internet Information Server 7.0, 7.5, or 8.0
  • Windows 7 or Windows 8

Перейдем к делу.

Создадим новый проект

  1. Открыть Visual Studio.
  2. Создать новый пустой проект (Ctrl+Shift+N). Укажите имя и задайте расположение файлов.
  3. Будет создан пустой проект.
  4. Создать новую библиотеку класса (C#). Указать Имя и не менять расположение. Примечание: мы специально не используем шаблоны вида WCF Service Application.

Чтобы сделать WCF сервис необходимо добавить сборку System.ServiceModel. Для этого:

  1. Правой кнопкой по References/Добавить ссылку
  2. Перейти на платформу (Framework) и выбрать System.ServiceModel.

Теперь в обозревателе решений, развернув References вы увидите сборку System.ServiceModel в списке.

Опишем сервисный контракт

Контекстное меню на сервисе Добавить/Создать элемент.

Выбрать элемент "Интерфейс". Дать ему имя. Имя интерфейса обычно начинается с "I".

В проект добавился интерфейс, который мы будем использовать как интерфейс сервиса.

Его нужно дописать:

  • Добавить сборку using System.ServiceModel;
  • Добавить предопределенный атрибут [ServiceContract];
  • Добавить метод GetMessage в интерфейс. Этот метод имеет один параметр сроку, и возвращает строку. Перед методами добавляется предопределенный атрибут [OperationContract].
  • Указать что интерфейс будет публичным.

Получилось вот так:

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

namespace ARVIClubService
{
    [ServiceContract]
    public interface IARVIClubService
    {
        [OperationContract]
        string GetMessage(string name);
    }
}

Реализация сервисного контракта

Мы описали сервисный контракт, теперь нужно реализовать операцию/метод сервиса, который мы описали в сервисном контракте. Для этого мы используем тот пустой заготовленный VS для нас класс. 

Сначала необходимо его переименовать. VS корректно заменит все необходимые ссылки при переименовании.

Далее:

  • Указать, что класс описывает интерфейс IARVIClubService. public class ARVIClubService:IARVIClubService
  • Нажать "Реализовать интерфейс":
    Появится заготовка:
  • В заготовку можно вписывать то, что делает метод.
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    
    namespace ARVIClubService
    {
        public class ARVIClubService:IARVIClubService
        {
            public string GetMessage(string name)
            {
                return "Hello Club from " + name + "!";
            }
        }
    }

     

И последнее: Если решение строится без ошибок, то все сделано правильно.

Проект прилагаю к статье. 

HelloService.zip (18,79 Кб)

В следующей статье, которая уже готовится, будем размещать сервис на IIS.

Алексей Семакин
мы специально не используем шаблоны вида WCF Service Application

А что в них плохого, Артур? Почему не используем?

 

Андрей Девятьяров

Отличная тема для освещения, пиши еще!

Артур Шахмин
А что в них плохого, Артур? Почему не используем?

VS много что может готовить сама. Однако для того, чтобы пользоваться шаблонами нужно понимать из чего шаблон состоит. Большинство материалов в инете показывают как все просто, а понимания, "что там произошло после нажатия таких простых трех кнопок" не остается. А т.к. я поставил целью объяснить самым не прокаченным читателям, то в серии статей я не буду намеренно пользоваться шаблонами, чтобы можно было понять "а как это внутри".

Алексей Пантюхин

Описано просто и доступно.

Авторизуйтесь, чтобы написать комментарий