Сервисы 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, предоставляемые этой службой, с любого клиента, будь то рабочий стол или Интернет. И, конечно же, вы можете проверить это прямо из браузера.