ASP.NET Результаты веб-службы, прокси-классы и преобразование типов

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

  •  08-06-2019
  •  | 
  •  

Вопрос

Я все еще новичок в мире ASP.NET, так что здесь я мог бы быть далек от истины, но пока это в меру моих (ограниченных) знаний!

Допустим, у меня есть стандартный бизнес-объект "Контакт" в Бизнес пространство имен.Я пишу веб-сервис для извлечения информации о Контакте из базы данных и возврата ее.Затем я пишу клиентское приложение, чтобы запросить указанные детали.

Теперь я также создаю служебный метод, который берет "Контакт" и творит с ним какую-то магию, например Utils.BuyContactNewHat() скажи.Что, конечно, требует Контакта типа Business.Contact.

Затем я возвращаюсь к своему клиентскому приложению и хочу использовать BuyContactNewHat метод, поэтому я добавляю ссылку на свой Утилиты пространство имен, и вот оно.Однако возникает проблема с:

Contact c = MyWebService.GetContact("Rob);
Utils.BuyContactNewHat(c); // << Error Here

Поскольку возвращаемый тип GetContact состоит из MyWebService.Contact и не Business.Contact как и ожидалось.Я понимаю, почему это происходит, потому что при доступе к веб-сервису вы фактически программируете против прокси-класса, сгенерированного WSDL.

Итак, есть ли "более простой" способ справиться с этим типом несоответствия?Я подумывал о том, чтобы, возможно, попытаться создать универсальный класс конвертера, который использует отражение, чтобы гарантировать, что два объекта имеют одинаковую структуру, а не просто переносить значения из одного в другой.

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

Решение

Вы на правильном пути.Чтобы получить данные из прокси-объекта обратно в один из ваших собственных объектов, вы должны выполнить левосторонний код.т. е.скопируйте значения свойств.Держу пари, что уже существует универсальный метод, который использует отражение.

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

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

На самом деле вам не обязательно использовать сгенерированный класс, который предоставляет вам WSDL.Если вы посмотрите на код, который он генерирует, то увидите, что он просто вызывает некоторые классы .NET framework для отправки запросов SOAP.В прошлом я копировал этот код в обычный файл .cs и редактировал его.Хотя я не пробовал это специально, я не вижу причин, по которым вы не могли бы удалить определение прокси-класса и использовать исходный класс для получения результатов вызова SOAP.Должно быть, он уже делает рефлексию под капотом, кажется, стыдно делать это дважды.

Я бы порекомендовал вам рассмотреть возможность написания расширения импортера схемы, которое вы можете использовать для управления генерацией кода прокси.Этот подход может быть использован для (изящного) решения вашей проблемы без сбоев (например, копирования объектов из одного пространства имен в другое или изменения класса reference.cs, созданного прокси-сервером, только для того, чтобы заменить его при следующем обновлении веб-ссылки).

Вот (очень) хороший учебник по этому предмету:

http://www.microsoft.com/belux/msdn/nl/community/columns/jdruyts/wsproxy.mspx

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