Что может заставить службу WCF возвращать объект типа object

Согласно другому моему сообщению о Возвращаемые значения службы WCF, я использую веб-службу другой компании, и когда я добавляю ссылку на службу внутри Visual Studio, возвращаемое значение метода является объектом типа object.

Автор веб-службы показал мне код, и он фактически возвращает типизированный объект.

Мне что-то не хватает, или прокси-класс должен возвращать типизированное значение?

Есть ли настройка для создания прокси-класса или фактического сервиса?

ОБНОВЛЕНИЕ:

Я посмотрел на фактические классы, лежащие в основе службы WCF, и понял, что возвращаемое значение метода службы фактически возвращает интерфейс, который реализует конкретный тип. Конкретный тип помечается атрибутом [DataContract] (и соответствующими атрибутами [DataMember]), но интерфейс не имеет таких атрибутов. Может ли это быть причиной того, что служба установила тип возвращаемого значения как объект?


person John B    schedule 30.07.2009    source источник
comment
Кто-нибудь принял мое обновление?   -  person John B    schedule 03.08.2009
comment
Вам все еще нужно показать код. Покажите подпись операции в сервисном контракте.   -  person John Saunders    schedule 03.08.2009
comment
Есть причина, по которой вы не отвечаете?   -  person John Saunders    schedule 09.08.2009


Ответы (3)


Гипотетически, если бы вы были разработчиком сервиса, вы могли бы использовать KnownTypeAttribute:

[DataContract]
[KnownType(typeof(MyConcreteClass))]
public interface IMyInterface {
}

[DataContract]
public class MyConcreteClass : IMyInterface {
}

Я лично не пробовал это с интерфейсом, но я пробовал это с абстрактным базовым классом, и он отлично работает. Когда клиент получает возвращаемое значение, он может успешно преобразовать его в производный класс.

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

Хотя вы не контролируете служебный код, вы контролируете клиентский прокси-код. Вы можете попробовать вручную отредактировать прокси-классы, которые svcutil.exe дали вам, чтобы добавить KnownTypeAttribute самостоятельно. Делая это, вы берете на себя управление поведением DataContractSerializer на своей стороне, и если вы позаботитесь о том, чтобы не изменить формат передачи данных по ошибке, все это должно работать.

person Christian Hayter    schedule 05.08.2009

Прокси-класс - это сгенерированный файл, поэтому он может содержать ошибки. Если у вас есть копия контракта данных, вы можете изменить класс прокси, чтобы использовать правильный тип, а не System.Object, и все должно работать правильно.

Инструмент Visual Studio «Добавить ссылку на службу» и svcutil.exe очень хороши для создания прокси-классов, но они не идеальны. Создаваемые ими файлы вы можете изменять, и я бы посоветовал вам просто изменить операцию, чтобы вернуть правильный контракт данных.

person Andrew Hare    schedule 30.07.2009
comment
Но если я вручную изменю автоматически сгенерированный класс прокси, а затем обновлю службу, он перезапишет мои изменения, верно? - person John B; 30.07.2009
comment
Похоже, прокси-класс - это частичный класс. Таким образом, я могу вносить изменения. - person John B; 30.07.2009
comment
Вы не сможете изменить это с помощью частичного класса - вам нужно будет изменить сам прокси. Без тестирования я не могу точно сказать, перезапишет ли обновление службы ваши изменения, но даже в этом случае исправить это будет тривиально, и это будет ошибка компиляции, которую легко обнаружить. - person Andrew Hare; 30.07.2009
comment
А как насчет того обновления, которое я только что внес в вопрос, может ли интерфейс быть виноватым? - person John B; 30.07.2009

У нас была аналогичная проблема при использовании веб-службы Java из WCF.

В нашем случае тип, который он сказал, что он возвращал, был ограниченной версией того, что фактически возвращалось.

У нас сработало приведение объекта к ожидаемому типу. После этого данные были доступны.

Поэтому, чтобы решить вашу проблему, вы можете попытаться привести объект к ожидаемому типу.

person Shiraz Bhaiji    schedule 09.08.2009