Как мне обрабатывать различия с полями «Указано» в службах WCF с использованием VS 2010 и VS 2008? - PullRequest
3 голосов
/ 11 февраля 2011

Мы пытаемся перейти на VS 2010, и мы заметили странное поведение с нашими службами WCF.

В VS 2008, когда я добавляю указанную ссылку на службу WCF, для каждого поля объекта, которое не являетсяссылочный тип, в обозревателе объектов отображается свойство bool fieldNameSpecified.Я понимаю, что это существует, так что есть способ определить, действительно ли значение, возвращаемое службой, имеет значение, поскольку DateTime, ints и т. Д. Не могут быть нулевыми.

Когда я пытаюсь добавитьта же ссылка в VS 2010 (установлен на .Net 3.5), все эти поля fieldNameSpecified отсутствуют.У нас есть код, который мы написали в VS 2008 и который просматривает эти поля fieldNameSpecified, в результате чего наши приложения ломаются при попытке использовать VS 2010 (поскольку прокси, созданные в VS 2010, не имеют этих полей fieldNameSpecified).

Есть ли способ заставить VS 2010 вернуть указанные поля обратно?Есть ли какое-то другое решение, которое не потребует от нас переписывать наш код?

Кроме того, каков правильный способ VS 2010, чтобы определить, действительно ли поле типа значения (int или DateTime) действительно содержит данные вон возвращается из службы?

Любая помощь, ПОЗДРАВЛЯЕМ с благодарностью!

Уточнение: поля fieldNameSpecified НЕ являются частью WSDL.VS 2008, очевидно, добавляет их в прокси для вашего удобства ...

Ответы [ 4 ]

5 голосов
/ 01 июля 2011

Недавно я столкнулся с противоположной ситуацией. Раньше не было никакого поля, указанного в xxx, но теперь они появились. И мы использовали только VS2008. Это приводит к тому, что значение необязательных полей не передается клиентскому приложению, поскольку для указанных полей xxx по умолчанию установлено значение false.

Если вы посмотрите на обе версии автоматически сгенерированного файла reference.cs под своей служебной ссылкой, вы должны заметить разницу. Один использует DataContractSerializer, другой использует XMLSerializer.

Когда вы добавляете ссылку на службу, если вы используете URL для службы, например, http://localhost/MyService.svc, будет использоваться DataContractSerializer. Если вы используете URL для WSDL, например, http://localhost/MyService.svc?wsdl, будет использоваться XMLSerializer.

1 голос
/ 22 февраля 2011

Вы также можете использовать атрибут EmitDefaultValue для решения вашей проблемы. Следуйте этим инструкциям:

http://bukovics.wordpress.com/2007/03/23/exposing-nullable-fields-to-net-11-web-service-clients/

Это также объясняет, почему вы получаете свойство fieldNameSpecified. Это именно то, что вам нужно, чтобы решить вашу проблему.

0 голосов
/ 22 февраля 2011

Я не тестировал его, но, возможно, вы могли бы удалить свои Service References и вместо этого поместить в свои проекты этап предварительной сборки, чтобы запустить старую версию WSDL.exe для генерации прокси.

0 голосов
/ 15 февраля 2011

Насколько я понимаю, если контракт данных требует свойств (например, если вы используете атрибут [DataMember(IsRequired=true)]), поля «Заданные» не генерируются автоматически. К сожалению, необязательное заполнение полей потребует изменения кода, но по крайней мере это не будет происходить на клиенте.

Альтернативный способ позволить вызывающим абонентам не указывать параметры (не знаю, больше ли это VS 2010-иш, чем поля «Задано») - это использовать Nullable<> типы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...