Как передать ссылочные типы между веб-сервисами? - PullRequest
1 голос
/ 26 августа 2009

У меня возникли некоторые трудности при передаче ссылочного типа между веб-сервисами.

Моя установка выглядит следующим образом.

У меня есть консольное приложение, которое ссылается на два веб-сервиса:

  1. WebServiceOne
  2. WebServiceTwo

WebServiceOne объявляет детали класса, который я использую в своем консольном приложении ... назовем его MyClass.

Мое консольное приложение вызывает WebServiceOne для получения списка MyClass.

Затем отправляет каждый MyClass в WebServiceTwo для обработки.

Внутри проекта, который содержит WebServiceTwo, есть ссылка на WebServiceOne, чтобы я мог иметь объявление MyClass.

Проблема, с которой я сталкиваюсь, заключается в том, что при компиляции невозможно определить, что MyClass, переданный из консольного приложения, совпадает с MyClass, объявленным в WebServiceOne, указанном в WebServiceTwo.

Я получаю сообщение об ошибке, в котором говорится, что Console.WebServiceOne.MyClass отличается от MyProject.WebServiceOne.MyClass.

Кто-нибудь знает, возможно ли это сделать? Возможно, я неправильно ссылаюсь на WebServiceOne? Есть идеи, что я могу делать не так?

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

Любая помощь будет оценена!

Ответы [ 3 ]

1 голос
/ 27 августа 2009

Я поговорил с одним из старших ребят на моей работе, и они предложили следующее решение, которое хорошо сработало для меня.

Решением было использование объекта передачи данных и удаление ссылки на WebServiceOne в WebServiceTwo.

По сути, в WebServiceTwo я определил представление всех полей типа значений, необходимых как BenefitDTO. Это эффективно позволяет мне упаковать все поля в один объект, поэтому мне не нужно передавать каждое из них в качестве параметров в методе.

Так что на данный момент это, кажется, лучшее решение ... так как оно работает и достигает моей цели.

Вполне вероятно, что я не очень хорошо объяснил свой вопрос ... что объясняет, почему никто не смог помочь ...

Но все равно спасибо! : -)

0 голосов
/ 16 сентября 2009

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

Я не совсем понимаю, в чем ваша проблема, но вот несколько предположений:

  • Если вы пытаетесь сравнить два объекта на равенство, вам придется написать собственную функцию сравнения, которая сравнивает значения каждого значимого свойства / поля по очереди.
  • Если вы пытаетесь скопировать объект из одного сервиса в другой, вам придется написать свою собственную функцию копирования, которая по очереди копирует значения каждого значимого свойства / поля.

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

0 голосов
/ 26 августа 2009

Переместите типы в отдельную сборку и убедитесь, что обе службы используют это. В ссылке на веб-сервис, вероятно, есть какой-то автоматически сгенерированный код, который называется Reference.cs. Измените это, чтобы использовать ваши типы.

Редактировать: отразить комментарии

В этом случае возьмите reference.cs из этого веб-сервиса, которым вы не можете управлять, использовать его как общий тип.

...