C#:Веб-сервис изменяет ожидаемый тип параметра (с обычного POCO на автоматически созданный класс)

StackOverflow https://stackoverflow.com/questions/738994

Вопрос

У меня есть следующий класс в Библиотеке классов: Artist, который является POCO

Теперь у меня есть метод в веб-сервисе (который имеет ссылку на упомянутую выше библиотеку) с такой подписью:

[WebMethod]
public int Artist_AddArtist(Artist a) {
 //
}

Когда я пытаюсь использовать эту службу из приложения (у которого также есть ссылка на упомянутую выше библиотеку классов), ожидаемый параметр Artist_AddArtist метод не является Artist, но новый тип Artist который генерируется в Reference.cs который является частичным классом, который генерируется автоматически.

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

Как я могу исправить эту проблему?

Это было полезно?

Решение

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

эта статья объясняет, как перенести веб -сервис ASMX в службу WCF.

Другие советы

Вы не можете и не должны устранять проблему.

Некоторые другие посоветуют вам сделать что-то вроде редактирования сгенерированного файла, но это не очень хорошая практика (поскольку изменения исчезнут, как только веб-ссылка будет обновлена).

То, что вы видите, создано специально.Видишь Основы:Как работают веб-сервисы.

Вкратце, когда вы используете "Добавить веб-ссылку", Visual Studio загружает файл WSDL из службы и использует XML-схемы из WSDL для создания некоторых прокси-классов для представления XML, описанного схемой.Он также создает прокси-класс для самой службы, содержащий методы для каждой операции в службе.

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

Один из способов думать об этом заключается в том, что у вас есть эта проблема только потому, что и клиент, и сервис являются .NET.Если бы ваш клиент был написан на Java, то вы бы не думали о совместном использовании классов.


Обратите внимание, что WCF может сделать это, если это необходимо.Это вводит зависимость между клиентом и сервисом (они оба должны использовать совместимые версии сборки, содержащие классы), но когда вам нужно это сделать, опция есть.Это полезно, когда в этих классах есть поведение, которое должно использоваться как клиентом, так и службой.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top