У меня есть проект WCF, который состоит из:

WCF Server
WCF Client
WCF Class Library

Библиотека классов совместно используется сервером и клиентом и содержит объект Person. Следовательно, клиент может сделать это:

public Person XMLToPerson()
{
    ServiceReference1.Service1Client s1 = new ServiceReference1.Service1Client();
    Person p = s1.GetPerson();
    return p;
}

Что произойдет, если у вас есть клиент Java, который ссылается на веб-службу? Неужто это против совместимости?

Q1) Что произойдет, если у вас есть клиент Java? Как он может принять объект Person?

Q2) Почему веб-служба возвращает пользовательские типы вместо JSON / XML? Если он вернул JSON / XML, то клиент мог де стерилизовать его любым способом?

То же самое и для устаревших веб-служб (.asmx). К счастью, все веб-службы, которые я разработал в прошлом, используются только клиентами .NET, поэтому мне не нужно об этом думать. Однако этот вопрос всегда был в глубине души.

0
w0051977 5 Янв 2017 в 17:17
Я дал вам ответ ниже, но этот вопрос настолько важен для понимания того, как работает WCF и почему он существует, что я думаю, вам действительно стоит потратить некоторое время на введение в учебник, книгу или видео по WCF. На выбор должны быть сотни.
 – 
Jim L
5 Янв 2017 в 17:42

2 ответа

Если вы используете BasicHttpBinding, то между сервером и клиентом передается SOAP XML, а не объекты. Вы видите пользовательские типы в .net, потому что .net дает вам хорошую структуру, которая абстрагирует весь XML. Это важно в WCF, потому что WCF также можно использовать для работы с другими форматами и протоколами, изменяя или добавляя конфигурацию (а не переписывая код). ASMX также использует протокол SOAP, но не обладает той гибкостью, которой обладает WCF.

Вы можете столкнуться с проблемами несовместимости с разными реализациями SOAP на разных платформах, но я нечасто видел это.

0
Jim L 5 Янв 2017 в 17:38
Спасибо. Однако я не верю, что это отвечает ни на один из моих вопросов.
 – 
w0051977
5 Янв 2017 в 17:40
Вы спрашиваете, как тогда использовать SOAP из Java?
 – 
Jim L
5 Янв 2017 в 17:44

WCF обменивается информацией в формате SOAP, поэтому он хорошо совместим с другими языками. Клиенты Java могут быть Apache CXF для создания классов-оболочек, например,

http://adventuresinsoftware.com/blog/?p=481

Вы также можете преобразовать WCF для предоставления доступа к REST API, что в настоящее время довольно распространено.

Конкретно отвечу на ваши вопросы. Когда вы используете VS для создания ссылки на службу, преобразование SOAP в объект автоматически обрабатывается сгенерированными классами-оболочками (Apache CXF делает то же самое для клиентов Java). Вам действительно стоит взглянуть на сгенерированные классы, чтобы узнать, как это сделать. Вероятно, тогда вы также знаете, почему никто не хочет трогать необработанные данные SOAP, поскольку XML слишком многословен, и вы не хотите тратить время на себя.

0
Lex Li 5 Янв 2017 в 18:18
Спасибо. Если вы создаете канал динамически (а не добавляете ссылку на службу), то означает ли это, что SOAP возвращается напрямую, т.е. фреймворк не будет десериализовать SOAP в объект для вас?
 – 
w0051977
5 Янв 2017 в 18:49
Никто этого не делает, но да, технически говоря, если вы подключаетесь необработанным способом, вы можете видеть сообщения SOAP напрямую.
 – 
Lex Li
6 Янв 2017 в 05:32