Веб-сервис .NET, использующий экземпляр типа параметра?

#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. В каком-то тесте, который я проводил с веб-службами, я использовал класс, который копировал все общедоступные свойства одного класса в другой, но это усложняется более глубокими структурами … Зная, как использовать фактическое . Мне тоже были бы интересны сетевые классы вместо сгенерированных ссылок на веб-службы!