powered by simpleCommunicator - 2.0.40     © 2025 Programmizd 02
Форумы / WCF, Web Services, Remoting [игнор отключен] [закрыт для гостей] / WCF REST клиент. 2 варианта ответа метода.
14 сообщений из 14, страница 1 из 1
WCF REST клиент. 2 варианта ответа метода.
    #39230627
Vasiliy_Kashkin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
REST сервис может возвращать 2 совершенно разных XML-ответа:
1-й
Код: xml
1.
2.
3.
<responce>
  <post_id>1</post_id>
</responce>



2-й
Код: xml
1.
2.
3.
4.
<error>
   <error_code>1</error_code>
   <error_description>Произошла ошибка</error_description>
</error>



Когда какой вариант ответа придёт, заранее не известно.
Необходимо объявить прокси-метод, который сможет десериализовывать оба варианта ответа.

У меня сейчас такой вариант, но он может работать только с одним вариантом ответа:
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
    [ServiceContract]
    [XmlSerializerFormat]
    public interface IFlickrApi
    {
        [OperationContract]
        [WebGet(BodyStyle = WebMessageBodyStyle.Bare, ResponseFormat = WebMessageFormat.Xml,
        UriTemplate = "method/wall.post.xml?owner_id={owner_id}&message={message}&access_token={access_token}")]
        VK_Response WallPost(string owner_id, string message, string access_token);
    }

    [XmlRoot("error")]
    public class VK_error
    {
        [XmlElement("error_code")]
        public string error_code { get; set; }

        [XmlElement("error_msg")]
        public string error_msg { get; set; }
    }

    [XmlRoot("responce")]
    public class VK_Response//: VK_error
    {
        [XmlElement("post_id")]
        public string post_id { get; set; }
    }



То есть либо response, либо error (конкретно в представленном коде - response). А как сделать, чтобы обрабатывались (десериализовывались) оба варианта?
...
Рейтинг: 0 / 0
WCF REST клиент. 2 варианта ответа метода.
    #39230723
Фотография Axeleron
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Vasiliy_Kashkin, а почему бы не возвращать оба варианта вместе? Зачем усложнять жизнь себе?
...
Рейтинг: 0 / 0
WCF REST клиент. 2 варианта ответа метода.
    #39230762
Ролг Хупин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AxeleronVasiliy_Kashkin, а почему бы не возвращать оба варианта вместе? Зачем усложнять жизнь себе?

Может быть сервис не его
...
Рейтинг: 0 / 0
WCF REST клиент. 2 варианта ответа метода.
    #39230772
Vasiliy_Kashkin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ролг ХупинAxeleronVasiliy_Kashkin, а почему бы не возвращать оба варианта вместе? Зачем усложнять жизнь себе?

Может быть сервис не его

да, сервис не мой. Я пишу только клиента.
...
Рейтинг: 0 / 0
WCF REST клиент. 2 варианта ответа метода.
    #39230778
Фотография Axeleron
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Vasiliy_KashkinРолг Хупинпропущено...


Может быть сервис не его

да, сервис не мой. Я пишу только клиента.
Ну что я могу посоветовать? Сервис написан безобразно. Потому как вариант - просто получать SOAP XML и парсить его респонс при получении.
...
Рейтинг: 0 / 0
WCF REST клиент. 2 варианта ответа метода.
    #39230783
Ролг Хупин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Vasiliy_KashkinРолг Хупинпропущено...


Может быть сервис не его

да, сервис не мой. Я пишу только клиента.

в случае ошибки
Код: xml
1.
2.
3.
4.
<error>
   <error_code>1</error_code>
   <error_description>Произошла ошибка</error_description>
</error>



оно не генерирует exception на клиенте?
...
Рейтинг: 0 / 0
WCF REST клиент. 2 варианта ответа метода.
    #39230801
Vasiliy_Kashkin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ролг Хупин,

генерирует Exception:
------------------------------------------------------------------------------------------------------------------------------
Необработанное исключение типа "System.Runtime.Serialization.SerializationException" в mscorlib.dll

Дополнительные сведения: Невозможно десериализовать текст XML-сообщения с корневым именем "error" и корневым пространством имен "" (для операции "WallPost" и контракта ("IFlickrApi", " http://tempuri.org/")) с использованием XmlSerializer. Обеспечьте добавление типа, соответствующего XML, к известному семейству типов службы.
------------------------------------------------------------------------------------------------------------------------------

Что и понятно, для класса VK_Response задано XML-имя response, а не error.
...
Рейтинг: 0 / 0
WCF REST клиент. 2 варианта ответа метода.
    #39230803
Фотография Axeleron
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ролг Хупиноно не генерирует exception на клиенте?
Не думаю. Похоже, это стандартный паттерн респонса сервиса, только обычно имплементация несколько более универсальная - с использованием status_code, а потом уже error_code, если статус код не success.
...
Рейтинг: 0 / 0
WCF REST клиент. 2 варианта ответа метода.
    #39230809
Vasiliy_Kashkin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот если бы можно было определить что-то такое:

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
    [XmlRoot("*")]
    public class VK_Any
    {
        [XmlElement("error_code")]
        public string error_code { get; set; }

        [XmlElement("error_msg")]
        public string error_msg { get; set; }

        [XmlElement("post_id")]
        public string post_id { get; set; }
    }



То есть, чтобы в этот класс десериализовывались любые XML-документы - не важно, что в корне. Тогда в 1-м случае было бы заполнено только поле post_id, а во 2-м - только error_msg и post_id.
Но к сожалению [XmlRoot("*")] - лишь моя придумка, то что я хочу найти, но не знаю, как оно выглядит.
...
Рейтинг: 0 / 0
WCF REST клиент. 2 варианта ответа метода.
    #39230810
Vasiliy_Kashkin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
* а во 2-м - только error_msg и error_code.
...
Рейтинг: 0 / 0
WCF REST клиент. 2 варианта ответа метода.
    #39231222
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Vasiliy_Kashkin, а почему выбрали WCF для решения задачи?
...
Рейтинг: 0 / 0
WCF REST клиент. 2 варианта ответа метода.
    #39233698
Vasiliy_Kashkin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
skyANA,

1). Код получается красивым и элегантным.
2). Просто хотелось изучить возможности WCF.
...
Рейтинг: 0 / 0
WCF REST клиент. 2 варианта ответа метода.
    #39233713
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Vasiliy_KashkinskyANA,

1). Код получается красивым и элегантным.
2). Просто хотелось изучить возможности WCF.
C HttpWebRequest или WebClient код тоже получается красивым и элегантным.
А возможности WCF не изучить на REST сервисе и HTTP запросах.
...
Рейтинг: 0 / 0
WCF REST клиент. 2 варианта ответа метода.
    #39234030
Ролг Хупин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Vasiliy_KashkinРолг Хупинпропущено...


Может быть сервис не его

да, сервис не мой. Я пишу только клиента.


Кстати, тут рядом в теме я спрашивал и сам же отвечал, добавьте такой отлов, мне помогло

http://www.sql.ru/forum/1212778/kak-poluchit-tekst-oshibki-na-kliente
...
Рейтинг: 0 / 0
14 сообщений из 14, страница 1 из 1
Форумы / WCF, Web Services, Remoting [игнор отключен] [закрыт для гостей] / WCF REST клиент. 2 варианта ответа метода.
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]