C#:Веб-сервис изменяет ожидаемый тип параметра (с обычного POCO на автоматически созданный класс)
-
09-09-2019 - |
Вопрос
У меня есть следующий класс в Библиотеке классов: 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 может сделать это, если это необходимо.Это вводит зависимость между клиентом и сервисом (они оба должны использовать совместимые версии сборки, содержащие классы), но когда вам нужно это сделать, опция есть.Это полезно, когда в этих классах есть поведение, которое должно использоваться как клиентом, так и службой.