Статьи

Создание службы RESTful WCF

Сервисы RESTful сегодня довольно популярны, и вы можете найти их практически везде — сервисы обмена изображениями, сервисы погоды и все такое. Используя инструменты разработки .NET, вы также можете разработать RESTful-сервис, который будет предоставлять некоторые XML-данные запрашивающему клиенту.

Если вы думаете, что способ сделать это — создать веб-сервис ASMX, то я не буду об этом говорить. Веб-сервисы ASMX устарели, и использование их вместо WCF не будет правильным решением. В то же время вы, вероятно, знаете, что вы не можете напрямую вызывать службу WCF через веб-браузер — только через клиент, будь то рабочий стол или веб-приложение.

В этой статье я собираюсь показать вам, как можно создать службу RESTful WCF и вызывать ее непосредственно из браузера, чтобы получить необходимый вывод.

Разработка сервиса

Откройте Visual Studio и создайте новое приложение-службу WCF :

В существующем решении есть файл Web.config . Вместо того, чтобы редактировать его в данный момент, я бы порекомендовал удалить его, так как сейчас мы не будем его использовать. Когда я доберусь до стадии отладки, я позволю IDE сгенерировать новую с только присутствующими настройками отладки.

Когда вы просматриваете существующий код, вы видите, что есть много примеров данных, которые могут быть полезными для вас. Я удалил его, поэтому у меня есть чистый класс Service1 и чистый интерфейс IService1 .

ПРИМЕЧАНИЕ. Я оставляю имена по умолчанию для службы и связанных компонентов.

Итак, после очистки мой класс обслуживания выглядит так:

using System;using System.Runtime.Serialization;using System.ServiceModel;using System.ServiceModel.Web;namespace REST_TEST{    public class Service1 : IService1    {            }}

И интерфейс для вышеупомянутого сервиса выглядит так:

using System;using System.Runtime.Serialization;using System.ServiceModel;using System.ServiceModel.Web;namespace REST_TEST{    [ServiceContract]    public interface IService1    {    }}

Теперь в интерфейсе IService1 я собираюсь определить пример метода GetDateTime , который будет возвращать строку. Единственное, что я должен добавить к этому, — это дополнительный набор атрибутов, которые будут контролировать, как этот метод будет использоваться службой WCF. Итак, вот что у меня есть:

[ServiceContract]public interface IService1{    [WebGet(UriTemplate="/")]    [OperationContract]    string GetDateTime();}

С помощью WebGet я указываю, что метод будет доступен через вызов REST. UriTemplate определяет точку доступа, это существо набор к корню. Поэтому при тестировании службы в браузере адрес для вызова метода GetDateTime будет http: // localhost: 3660 / Service1.svc / . Я могу легко изменить это на что-то другое, например — / GetDateTime :

[WebGet(UriTemplate="/GetDateTime")]

Таким образом, когда я получу доступ к сервису по его корневому идентификатору, я получу ошибку «Конечная точка не найдена» (поскольку для этого не определена конечная точка). Однако если я получу доступ к http: // localhost: 3660 / Service1.svc / GetTimeDate , я вызову нужный метод и получу правильный вывод.

OperationContract указывает, что метод является частью операции, с которой служба связана через контракт. Этот атрибут должен присутствовать в определении метода (внутри интерфейса), чтобы иметь возможность вызывать его из текущей службы.

Теперь давайте поработаем над реальным методом.

public string GetDateTime(){    return DateTime.Now.ToString();}

Это вернет текущую дату и время. Из-за характера службы, данные будут сериализованы автоматически при возврате, поэтому на этом этапе вам не нужно беспокоиться о ручной сериализации.

Прежде чем идти дальше, необходимо включить публикацию метаданных для службы. Для этого щелкните правой кнопкой мыши Service1.svc в обозревателе решений и выберите « Просмотреть разметку» :

Оказавшись там, добавьте следующее свойство в существующий набор:

Factory="System.ServiceModel.Activation.WebServiceHostFactory"

Теперь щелкните правой кнопкой мыши Service1.svc в Solution Explorer еще раз и выберите View in Browser . После открытия браузера вы должны увидеть ответ, подобный следующему:

Это абсолютно нормально, так как я не определил конечную точку для корневого расположения. Теперь в адресной строке сразу после имени службы введите / GetDateTime . Когда вы перейдете по этому адресу, вот что вы должны получить:

Как я уже упоминал ранее, данные автоматически сериализуются (если это возможно) и возвращаются пользователю. Теперь вы можете использовать данные XML, предоставляемые этой службой, с любого клиента, будь то рабочий стол или Интернет. И, конечно же, вы можете проверить это прямо из браузера.