Студопедия

КАТЕГОРИИ:


Архитектура-(3434)Астрономия-(809)Биология-(7483)Биотехнологии-(1457)Военное дело-(14632)Высокие технологии-(1363)География-(913)Геология-(1438)Государство-(451)Демография-(1065)Дом-(47672)Журналистика и СМИ-(912)Изобретательство-(14524)Иностранные языки-(4268)Информатика-(17799)Искусство-(1338)История-(13644)Компьютеры-(11121)Косметика-(55)Кулинария-(373)Культура-(8427)Лингвистика-(374)Литература-(1642)Маркетинг-(23702)Математика-(16968)Машиностроение-(1700)Медицина-(12668)Менеджмент-(24684)Механика-(15423)Науковедение-(506)Образование-(11852)Охрана труда-(3308)Педагогика-(5571)Полиграфия-(1312)Политика-(7869)Право-(5454)Приборостроение-(1369)Программирование-(2801)Производство-(97182)Промышленность-(8706)Психология-(18388)Религия-(3217)Связь-(10668)Сельское хозяйство-(299)Социология-(6455)Спорт-(42831)Строительство-(4793)Торговля-(5050)Транспорт-(2929)Туризм-(1568)Физика-(3942)Философия-(17015)Финансы-(26596)Химия-(22929)Экология-(12095)Экономика-(9961)Электроника-(8441)Электротехника-(4623)Энергетика-(12629)Юриспруденция-(1492)Ядерная техника-(1748)

Пример REST веб-службы




 

Для управления отображением строки URL в параметры методов есть два основных атрибута: WebGet и WebInvoke. WebInvoke успешно заменяет WebGet.

 

[ServiceContract(Name = "WeatherService",

Namespace = "http://www.mycompany.com/weather/2010/05/24")]

public interface IWeatherService

{

[WebGet(UriTemplate = "temperature/get?loc={location}")]

[OperationContract]

double GetTemperature(string location);

 

[WebInvoke(Method = "GET",

UriTemplate = "weather/get?loc={location}",

ResponseFormat = WebMessageFormat.Xml)]

[OperationContract]

WeatherInfo GetWeatherInfo(string location);

 

[WebInvoke(Method = "GET",

UriTemplate = "weather2/get?loc={location}&type={resultType}")]

[OperationContract]

Stream GetWeatherInfo2(string location, string resultType);

 

[WebInvoke(Method = "GET",

UriTemplate = "weather/feed")]

[OperationContract]

[ServiceKnownType(typeof(Atom10FeedFormatter))]

SyndicationFeedFormatter GetWeatherInfoFeed();

}

 

WebInvoke имеет параметр Method – это имя метода HTTP. Можно указать POST, PUT, READ, GET и другие методы. Это тот метод HTTP, который использует клиент.

 

WebGet отличается тем, что в нем сразу предопределен метод – GET. Для него указывается строка шаблона адреса – UriTemplate. Здесь указываются имена параметров. В шаблоне указывается имя (в примере это temperature/), имя метода – get, далее, после знака вопроса, идут параметры запроса.

 

UriTemplate = "temperature/get?loc={location}" В имени параметра используется loc, а не location, потому что в HTTP запросах строка ограничена по размеру, поэтому принято сокращать имена параметров. Сокращение позволяет помещать больше параметров.

В фигурных скобках указывается имя передаваемого параметра. Это имя должно совпадать с именем параметра метода, к которому применяется атрибут. В приведенном примере параметр в атрибуте WebGet {location} будет ассоциирован с соответствующим параметром метода GetTemperature, string location.

Пусть был вызван GetTemperature:

http://localhost/WeatherService/temperature/get?loc=Minsk.

 

temperature будет использоваться для поиска нужного метода, а значения параметров после вопроса будут разобраны и переданы в метод.

 

public class WeatherService: IWeatherService

{

private string LastLocation;

 

public double GetTemperature(string location)

{

Console.WriteLine("Last location: {0}", LastLocation);

LastLocation = location;

if (string.Compare(location, "Minsk", true) == 0)

return +15;

else if (string.Compare(location, "Vitebsk", true) == 0)

return +13;

else

return double.MinValue;

}

 

public WeatherInfo GetWeatherInfo(string location)

{

Console.WriteLine("Last location: {0}", LastLocation);

LastLocation = location;

if (string.Compare(location, "Minsk", true) == 0)

{

var res = new WeatherInfo()

{

Temperature = 15,

Humidity = 50,

Pressure = 760,

};

return res;

}

else if (string.Compare(location, "Vitebsk", true) == 0)

{

var res = new WeatherInfo()

{

Temperature = 13,

Humidity = 48,

Pressure = 750,

};

return res;

}

else

return null;

}

 

<...>

}

 

GetTemperature проверяет пришедшее значение и в зависимости от него возвращает температуру. Рассмотрим, в каком виде клиент получит ответ.

 

static void Main()

{

var host = new WebServiceHost(

typeof(WeatherService),

new Uri("http://localhost/WeatherService/"));

host.Open();

Console.WriteLine("Press ENTER to stop the service");

Console.ReadLine();

}

 

Для REST -служб нужно использовать не ServiceHost, а WebServiceHost. WebServiceHost отличается тем, что обеспечивает возможность создания точки доступа для прослушивания конкретного HTTP адреса.

 

В параметрах конструктора указывается тип данных службы и URL, на котором разместится служба. Драйвер HTTP обеспечивает возможность прослушивания на одном и том же порту (80й в примере) запросов разными программами – несколько программ могут слушать запрос. Для этого внутри HTTP реализована концепция мультиплексирования запросов в зависимости от строки адреса. Эта же концепция использовалась в примере с ручным конфигурированием SOAP веб-службы.

Фактически здесь происходит регистрация на 80м порту указанного URL, указание которого в строке обеспечит дальнейшую маршрутизацию запросов HTTP программе, которая зарегистрировала свой метод прослушивания входящих запросов. В этом ключевое отличие HTTP от TCP. В TCP, который предоставляется ОС, такой возможности нет, т.к. в нем никак не оговорено содержимое запроса. Единственная точка подключения при доступе по TCP – IP адрес и номер порта. В HTTP всегда, кроме этих данных, после установки соединения происходит передача запроса с заголовками, где обязательно есть заголовок запроса, в котором указывается метод и URL. Он и используется для маршрутизации и мультиплексирования соединения.

 

Метод Main обязательно должен быть запущен с правами администратора, иначе операционная система не даст зарегистрировать службу.




Поделиться с друзьями:


Дата добавления: 2014-11-16; Просмотров: 412; Нарушение авторских прав?; Мы поможем в написании вашей работы!


Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет



studopedia.su - Студопедия (2013 - 2024) год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! Последнее добавление




Генерация страницы за: 0.009 сек.