#vb.net #web-services #types #proxy-classes
Вопрос:
В моем решении есть проект Windows forms и проект веб-службы, и я пытаюсь вызвать веб-службу и в результате вернуть объект customer. Проблема в том, что когда я пытаюсь получить возвращаемый объект, я получаю сообщение об ошибке, что он не может его преобразовать. Например, вот подпись для моего веб-сервиса:
Public Function GetDriverByID(ByVal DriverID As Integer) As Driver
И вот код, который я использую для его вызова:
Dim d As Driver = mywebserviceinstance.GetDriverByID(1)
Но я получаю эту ошибку во время компиляции (wsDrivers-это имя веб-ссылки, которую я добавил в свой проект формы): «Значение типа ProjectNamespace.Обычный.wsDrivers.Драйвер не может быть преобразован в пространство имен проекта.Обычный.Водитель»
Это «Общее» пространство имен содержит класс драйвера, и я не уверен, почему возвращаемый класс из веб-службы является не просто общим «Драйвером», а вместо этого «wsDrivers».Драйвер», и я не могу преобразовать его обратно. Кто-нибудь знает, как я могу справиться с этим несоответствием типа?
РЕДАКТИРОВАТЬ: Спасибо за объяснения — это на самом деле проясняет, что он делает. Однако есть ли какой-либо способ заставить его использовать фактический тип вместо прокси (или, скорее, есть ли какой-либо способ преобразования между «реальным» экземпляром и экземпляром «прокси»), или мне нужно сериализовать свойства, прежде чем отправлять их по проводу, а затем вручную отменить сериализацию возвращаемых значений?
Ответ №1:
На самом деле это довольно распространенное явление. Происходит то, что веб-служба определила в нем определения всех типов, используемых в веб-службе. Когда вы добавляете ссылку на эту веб-службу, она автоматически создает тип прокси-сервера в подпространстве вашего пространства имен. Это то, что возвращается вашей веб-службой, когда вы ее вызываете.
Однако вы, вероятно, также ссылаетесь на ту же библиотеку, что и веб-служба отдельно, которая содержит один и тот же тип. Это тип, который ожидается при отключении драйвера. Вот почему существует несоответствие.
Комментарии:
1. Есть ли какой-нибудь способ обойти это? Поскольку я ссылаюсь на одну и ту же библиотеку DLL в обоих проектах (веб-сервис и проект с веб-ссылкой), могу ли я заставить «прокси-класс» быть копией его фактического класса? Или есть простой способ сопоставить их друг с другом?
Ответ №2:
Ссылка на веб-службу в VB.NET или проект C# может ссылаться на любой тип веб-службы и не ограничивается теми, которые предоставляются ASP.NET. Вот почему Visual Studio создает прокси-классы для каждого объекта, которые могут быть получены из веб-службы.
Комментарии:
1. В каком-то тесте, который я проводил с веб-службами, я использовал класс, который копировал все общедоступные свойства одного класса в другой, но это усложняется более глубокими структурами … Зная, как использовать фактическое . Мне тоже были бы интересны сетевые классы вместо сгенерированных ссылок на веб-службы!