Пишем RESTful веб-сервис на ASP.NET
2026-03-10 12:15 Diff

Как известно, веб-сервисы можно создавать на разных языках. Давайте напишем REST-приложение, используя .NET и Visual Studio. Результат — веб-сервис, работающий со следующим набором данных «туториалов»:

Будут реализованы следующие RESTful-методы: • GET Tutorial (при вызове клиент получит все доступные TutorialName); • GET Tutorial/TutorialId (при вызове клиент получит TutorialName, соответствующий переданному TutorialId); • POST Tutorial/TutorialName (при вызове клиент отправит запрос на добавление туториала с переданным TutorialName); • DELETE Tutorial/TutorialId (при вызове клиент отправит запрос на удаление туториала с TutorialName, которое соответствует переданному TutorialId).

Итак, перейдём к поэтапному созданию веб-сервиса.

Этап № 1

В первую очередь, создаём пустое ASP.NET web-приложение. Для этого открываем Visual Studio и создаём новый проект:

Далее должно появиться новое диалоговое окно.

Этап № 2

В открывшемся окне переходим по вкладкам C# → Веб. И выбираем опцию «Веб-приложение ASP.NET (.NET Framework)», а потом вводим нужные данные вашего проекта (название, каталог):

В итоге должно открыться окно, где можно увидеть наш проект:

Этап № 3

Теперь нам надо создать файл будущего RESTful веб-сервиса. Для этого кликаем правой кнопкой по файлу проекта Webservice.REST (также можно нажать Ctrl+Shift+A) и выбираем опции Add->new item:

Откроется окно, где находим опцию «WCF Service (с поддержкой технологии AJAX)» и даём ей имя TutorialSevice.svc. После выбора этой опции Visual Studio создаст код, который станет основой для реализации web-сервиса. В нашем случае WCF (Windows Communication Foundation) — это библиотека, используемая для налаживания взаимодействия между приложениями посредством разных протоколов типа TCP, HTTP и HTTPS. Что касается AJAX, то эта технология позволяет асинхронно обновлять web-страницы и обмениваться небольшими объёмами данных с сервером.

Этап № 4

Теперь надо внести изменения в Web.config. Это конфигурационный файл, который содержит настройки, нужные для правильной работы приложения. Таким образом, наше изменение позволит приложению отправлять и принимать данные как RESTful веб-сервис.

Открываем конфигурационный файл:

В открывшемся файле находим строку <enableWebScript />:

и меняем её на <webHttp />:

Этап № 5

Теперь можно браться за код. Открываем файл TutorialService.svc и сначала добавим код для отображения наших данных. Для этого создаём список со строками «Queues», «Arrays» и «Stacks». Эти строки будут отражать имена доступных туториалов:

namespace Webservice.REST { [ServiceContract(Namespace = "")] [AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed public class TutorialService { private static List lst = new List (new String[] {"Arrays","Queues","Stacks"});

Этап № 6

Теперь давайте напишем код для метода GET в этом же файле. Данный метод станет запускаться при каждом вызове сервиса из веб-браузера. Он будет применяться для получения доступных туториалов:

[WebGet(UriTemplate="/Tutorial")] public String GetAllTutorial() { int count = 1st.Count; String TutorialList = ""; for (int i = 0; i < count; i++) TutorialList = TutorialList + lst[i] + ","; return TutorialList; }

Обратите внимание на строку [WebGet(UriTemplate="/Tutorial")] — она очень важна и необходима для определения, как мы будем вызывать данный метод по URL. К примеру, если наш сервис расположен по адресу http://localhost:52645/TutorialService.svc, а в его конец мы добавим «/Tutorial» и получим http://localhost:52645/TutorialService.svc/Tutorial, то будет вызван вышенаписанный код.

Атрибут WebGet — это параметр, позволяющий GetAllTutorials() быть RESTful-методом, который можно вызвать GET-запросом.

Что касается самого метода GetAllTutorials(), то в нём есть код, собирающий все названия туториалов и возвращающий их в одной строке.

Этап № 7

Идём далее. Нижеуказанный код необходим, чтобы вернуть соответствующий TutorialName при получении GET-запроса с TutorialId:

[WebGet (UriTemplate = "/Tutorial/{Tutorialid}")] public String GetTutorialbyID(String Tutorialid) { int pid; Int32.TryParse(Tutorialid, out pid); return lst[pid]; }

Как и в примере выше, первая строка — наиболее важна, ведь она определяет, как мы будем вызывать данный метод. Если мы сделаем запрос http://localhost:52645/TutorialService.svc/Tutorial/1, то web-сервис должен вернуть TutorialName, соответствующий TutorialId с индексом 1.

Реализует описанную логику метод GetTutorialByID(). Учтите, что мы приводим TutorialId к типу Integer. Связано это с тем, что всё, что передаётся адресную строку веб-браузера является строкой. А так как индексом списка строка быть не может, мы добавляем код, нужный для преобразования в число.

Этап № 8

Теперь пришла очередь кода для метода POST, который мы будем вызывать каждый раз, когда захотим добавить строку в наш список туториалов посредством POST-запроса:

[WebInvoke(Method = "POST", RequestFormat = WebMessageFormat.Json, UriTemplate = "/Tutorial", ResponseFormat = WebMessageFormat.Json, BodyStyle = WebMessageBodyStyle.Wrapped)] public void AddTutorial(string str) => lst.Add(str);

На первой строке — атрибут WebInvoke, прикреплённый к методу, — это позволяет вызывать его посредством POST-запроса. Что касается атрибутов RequestFormat и ResponseFormat, то мы указываем для них JSON, так как именно с этим форматом функционирует RESTful веб-сервис.

Этап № 9

Что же, теперь добавим метод для работы с DELETE-запросами. Этот метод станет вызываться каждый раз, когда мы будем пытаться удалить имеющееся значение из списка посредством DELETE-запроса:

[WebInvoke(Method = "DELETE", RequestFormat = WebMessageFormat.Ison, UriTemplate = "/Tutorial/{Tutorialid}", ResponseFormat = WebMessageFormat.Json, BodyStyle = WebMessageBodyStyle.Wrapped)] public void DeleteTutorial(String Tutorialid) { int pid; Int32.TryParse(Tutorialid, out pid); 1st.RemoveAt(pid); }

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

Что касается метода DeleteTutorial(), то в нём мы приводим переданный TutorialId к типу Integer, удаляя из списка соответствующий элемент.

В результате код должен выглядеть так (без учёта элементов, бывших там изначально):

using System; using System.Collections.Generic; using System.Linq; using System.Runtime.Serialization; using System.ServiceModel; using System.ServiceModel.Activation; using System.ServiceModel.Web; using System.Text; namespace Webservice.REST { [ServiceContract(Namespace = "")] [AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)] public class TutorialService { private static List<string> lst = new List<string> { "Arrays", "Queues", "Stacks" }; [WebGet(UriTemplate = "/Tutorial")] public string GetAllTutorials() => String.Join(",", lst); [WebGet(UriTemplate = "/Tutorial/{TutorialId}")] public string GetTutorialByID(string TutorialId) { int pid; if (!TryParse(TutorialId, out pid)) { throw new HttpResponseException("TutorialId must be an integer", HttpStatusCode.BadRequest); } return lst[pid]; } [WebInvoke(Method = "POST", RequestFormat = WebMessageFormat.Json, UriTemplate = "/Tutorial", ResponseFormat = WebMessageFormat.Json, BodyStyle = WebMessageBodyStyle.Wrapped)] public void AddTutorial(string str) => lst.Add(str); [WebInvoke(Method = "DELETE", RequestFormat = WebMessageFormat.Json, UriTemplate = "/Tutorial/{TutorialId}", ResponseFormat = WebMessageFormat.Json, BodyStyle = WebMessageBodyStyle.Wrapped)] public void DeleteTutorial(string TutorialId) { int pid; if (!TryParse(TutorialId, out pid)) { throw new HttpResponseException("TutorialId must be an integer", HttpStatusCode.BadRequest); } lst.RemoveAt(pid); } } }

Вот и всё, RESTful веб-сервис на ASP.NET создан! Теперь нужно его запустить и протестировать. Но об этом поговорим в следующий раз.

Источник: «RESTful Web Services Tutorial with Example».