Форум программистов, компьютерный форум, киберфорум
Lenoshka
Войти
Регистрация
Восстановить пароль

WCF сервис. Создание сервиса, использующего методы Post и Get

Запись от Lenoshka размещена 04.06.2014 в 13:17
Показов 12718 Комментарии 0

Итак, постараюсь рассказать, как создать простенький сервис с тремя методами для различных потребностей.
Информации на просторах Интернета много, но есть нюансы, с которыми пришлось повозиться. Именно на них я и сделаю акцент в статье.
Создание сервиса.
Запускаем студию и создаем новый проект WCF Service Applikation с красивым и понятным названием.
После нажатия кнопки ОК откроется сам проект уже с шаблоном. Можно его удалить, т.к. я все буду делать по-другому.
Методы сервиса описываются в интерфейсе, а уже их реализация описывается в программе.
Чтобы описать наши методы (их будет 3), нужно открыть файл IService1.cs.
Файлы, конечно же, лучше переименовать с учетом целей вашего проекта.
Создавать будем 3 метода
EchoGet — принимает данные методом get (т.е. данные для вносятся в строку uri)
EchoPost — принимает данные методом post (тоже через строку uri)
EchoPostStream — принимает данные методом post, но уже затолканные через входящий поток.
Код объявления методов выглядит следующим образом:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
[ServiceContract]
    public interface IService1
    {
 
        [OperationContract]
        string EchoGet(string value);
 
        [OperationContract]
        string EchoPost(string value);
 
        [OperationContract]
        string EchoPostStream(Stream value);
 
      }
Теперь каждому методу нужно рассказать, каким же образом он будет получать сообщения. Для этого служат атрибуты WebGet (для приема сообщения мотодом get) и WebInvoke (для приема сообщения методом post):

C#
1
2
3
4
5
6
7
8
9
10
11
  [OperationContract]
        [WebGet]
        string EchoGet(string value);
 
        [OperationContract]
        [WebInvoke]
        string EchoPost(string value);
 
        [OperationContract]
        [WebInvoke]
        string EchoPostStream(Stream value);
Следующим шагом будет описание в методе, где именно в uri будет передаваемая информация. Для этого нужно описать шаблон при помощи указания UriTemplate.

C#
1
2
3
 [OperationContract]
        [WebInvoke(UriTemplate="/{value}")]
        string EchoPost(string value);
По-умолчанию считается, что в методах WebInvoke данные передаются методом POST, но лучше это прописать явно:
[OperationContract]
[WebInvoke(Method="POST", UriTemplate="/{value}")]
string EchoPost(string value);

C#
1
2
3
 [OperationContract]
        [WebInvoke(Method="POST")]
        string EchoPostStream(Stream value);
Метод передается как строка!
Собственно, пока все. Можно начинать описывать реализацию.
В описании ничего замысловатого нет: приняли строку/поток и вернули строку.
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
 public string EchoGet(string value)
        {
            return value;
        }
 
        public string EchoPost(string value)
        {
            return value;
        }
 
        public string EchoPostStream(Stream value)
        {
            StreamReader reader = null;
            reader = new StreamReader(value);
            string str = reader.ReadToEnd();
            return str;
        }
Как бы все. Можно начинать тестировать. Это действо лучше проводить с помощью Fiddlera. По крайней мере можно будет задать тип контента, что очень важно в некоторых случая, и посмотреть, что вообще происходит.
Итак, запускаем наш сервис. Первые два метода можно протестировать прямо в студии. Для этого имеется специальный WCF Test Client. Выбираете метод в левой части экрана, пишите входящее значение в столбце Value, нажимаете кнопку Invoke и получаете результат деятельности сервиса в нижней части окна (pic1).
Есть один нюанс: он откроется только если нажать кнопку Run при активной вкладке с реализацией методов — Service1.svc.cs. В противном случае откроется браузер с информацией о сервисе. (pic2)
Но методы работать в сети не будут. Все дело в том, что нужно описать конечную точку, т.е. куда методы будут отправлять результат своей работы.
Наш конфиг выглядит так:
XML
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
<?xml version="1.0"?>
 
<configuration>
  <system.serviceModel>
    <services>
      <service name="WCF_test.Service1">
        <endpoint address="" behaviorConfiguration="WebBehavior" binding="webHttpBinding" contract="WCF_test.IService1"/>
      </service>
    </services>
    <behaviors>
      <endpointBehaviors>
        <behavior name="WebBehavior">
          <webHttp/>
        </behavior>
      </endpointBehaviors>
    </behaviors>
  </system.serviceModel>
  <system.web>
    <compilation debug="true"/>
  </system.web>
</configuration>
В двух словах ключевые моменты:
XML
1
<service name="WCF_test.Service1">
— name состоит из имени namespace и имени класса-наследника интерфейса с описанием методов.
XML
1
<endpoint address="" behaviorConfiguration="WebBehavior" binding="webHttpBinding" contract="WCF_test.IService1"/>
— это конечная точка, binding — это привязка конечной точки, которая описывает «как» мы передаем данные. В нашем случае мы будем передавать данные через сеть, поэтому значение webHttpBinding.
Если мы укажем другие значения привязки, мы не сможем работать с фиддлером и браузером, но указав эту привязку, мы не сможем тестировать сервис через тест-клиент студии.

Итак, сервис запущен. Нужно узнать, через какой порт он получает информацию. Для этого обратимся к окну браузера, которое открывается при запуске: в адресной строке пишется адрес с номером порта.
http://localhost:22493/Service1.svc
Теперь можно проверить жизнеспособность методов.
Метод, передающий запрос с помощью метода get можно протестировать в браузере, введя в адресную строку следующее:
http://localhost:22493/Service... alue=Hello!

Первое, что идет за именем сервиса (Service1.svc) — косая черта, за ней — имя вызываемого метода (EchoGet). Знак вопроса после него говорит, что дальше будут идти переменные: value — имя переменной, Hello — ее значение.
Вот какой результат получился (pic3)
В фиддлере это выглядит т.о.(pic4)
В правой части: в адресной строке запрос к нашему методу с указанием переменной и ее значения.
В левой части: результат работы. Значение результата 200 говорит о том, что все прошло хорошо и наш сервис нам что-то вернул. Двойной щелчок по строке с результатом откроет нам следующее окно: (pic5)
Результат в нижней части.

Следующие методы в браузере уже не протестируем, поэтому обращаемся к Фиддлеру.
Метод EchoPost получает данные также через адресную строку. Мы даже объявили шаблон для того, чтобы метод знал, где эти данные искать:
C#
1
UriTemplate="/{value}"
В фигурных скобках указано имя переменной, именно на этом и будет ее искать метод. Значит запрос к методу будет выглядеть следующим образом: хост, порт, имя сервиса и… нет, не имя метода, а значение переменной.
Да, в этом подвох: имя метода в этом случае не указывается.(pic6)
Результат можно увидеть опять же, с помощью двойного щелчка по строке с результатом в правой части: (pic7)
Остался третий и самый подлый метод. Почему подлый? Да отнял у меня не один день жизни, пока я поняла, что он от меня хочет.

Вызвать его можно указав в адресной строке после имени сервиса имя метода, а в нижней части текст сообщения, которое пойдет в поток (pic8)
Результат (pic9)
С какими трудностями столкнулась я: иногда нужно указать тип входящего контента.
Это делается так: в окне request Header пишется следующая строка:
Content-Type: application/xml
По крайней мере так советуют многое специалисты в своих блогах. НО! Именно в моем случае тип был application/octet-stream
Если тип указан не верно, то будет ошибка 400.
Теперь о том, как узнать тип. Придумала не сама, а наткнулась в сети вот здесь:
https://vivekcek.wordpress.com... /#comments

Если кто-нибудь увидит в статье недочеты — пишите. Я же только учусь
Миниатюры
Нажмите на изображение для увеличения
Название: pic1.jpg
Просмотров: 550
Размер:	69.1 Кб
ID:	2420   Нажмите на изображение для увеличения
Название: pic2.jpg
Просмотров: 764
Размер:	156.5 Кб
ID:	2421   Нажмите на изображение для увеличения
Название: pic3.jpg
Просмотров: 551
Размер:	63.3 Кб
ID:	2422  

Нажмите на изображение для увеличения
Название: pic4.jpg
Просмотров: 665
Размер:	121.7 Кб
ID:	2423   Нажмите на изображение для увеличения
Название: pic5.jpg
Просмотров: 790
Размер:	131.2 Кб
ID:	2424   Нажмите на изображение для увеличения
Название: pic6.jpg
Просмотров: 542
Размер:	167.9 Кб
ID:	2425  

Нажмите на изображение для увеличения
Название: pic7.jpg
Просмотров: 716
Размер:	165.7 Кб
ID:	2426   Нажмите на изображение для увеличения
Название: pic8.jpg
Просмотров: 766
Размер:	121.8 Кб
ID:	2427   Нажмите на изображение для увеличения
Название: pic9.jpg
Просмотров: 626
Размер:	129.1 Кб
ID:	2428  

Размещено в Без категории
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Всего комментариев 0
Комментарии
 
Новые блоги и статьи
Программа опроса у.з. расходомера SLS-720F
Argus19 02.09.2026
Программа опроса у. з. расходомера SLS-720F Программа опрашивает один раз в минуту три ультразвуковых расходомера SLS-720F через интерфейс RS-485 по протоколу Modbus RTU. Опрашиваются регистры. . .
Hyper-V: Компьютер должен поддерживать доверенный платформенный модуль 2.0.
Maks 31.08.2026
При установке Windows 11 на виртуальную машину Hyper-V 2-го поколения вылезла такая ошибка: Решение: в параметрах виртуальной машины, в разделе "Безопасность" (Security) активировать флаг. . .
Архитектура биовида Стива в Майнкрафте: Зачем бонобо кубический каннибализм
anaschu 30.08.2026
Кубический Вагинокапитализм в Minecraft: Математический инвариант ОДУ и рок Стивов-бонобо Главная задача разработанной «Модели Всего» — наглядно продемонстрировать наличие системной «судьбы». . .
Оттачиваю умение писать js программы.
russiannick 30.08.2026
Проектом выходного дня стало написание Книги шифров Виженера. Итогом стала версия 200, синий туман. Синий туман назван так, потому что замораживает текст под собой. Нажатие синих кнопок управляют. . .
мат медиц модель 30. презентация проекта
anaschu 27.08.2026
хоп хоп хоп хидахоп, а я кладую))
Как у меня протекала болезнь
zorxor 27.08.2026
Здравствуйте, друзья! Эта запись блога предназначена именно для вас - для моих дорогих друзей, которые знали меня лично. Чтобы ответить на вопрос - а что же со мной произошло на самом деле? Я учился. . .
Нашел вот забавное видео о измерениях. Лучшее что я видел на эту тему
kumehtar 26.08.2026
ILETXiw9bMQ Основная суть и тезисы по измерениям: 0D (Нулевое измерение): точка, не имеющая длины, ширины, высоты или объема. Объект не может перемещаться в 0D. 1D (Первое измерение):. . .
[EasyBuilder Pro] Памятка по разработке для панелей Weintek
ФедосеевПавел 26.08.2026
Памятка по разработке для панелей Weintek ВВЕДЕНИЕ Ранее, при реализации проектов основное внимание уделял разработке управляющей программы для контроллера, а панели оператора доставалось время. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru