Что заставит службу WCF возвращать объект типа & # 8220; объект & # 8221;

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

Вопрос

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

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

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

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

UPDATE:

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

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

Решение

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

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

[DataContract]
public class MyConcreteClass : IMyInterface {
}

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

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

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

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

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

Visual Studio " Добавить ссылку на службу " tool и svcutil.exe очень хороши для генерации прокси-классов, но они не идеальны. Файлы, которые они генерируют, являются вашими для изменения, и я бы посоветовал вам просто изменить операцию, чтобы вернуть соответствующий контракт данных.

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

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

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

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

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