2009-07-22 2 views
16

В принципе, у меня есть серверный тип «Foo» с элементами X и Y. Всякий раз, когда я использую «Добавить серверную ссылку» Visual Studio, я вижу, что WSDL и сгенерированный прокси добавляют слово «Поле» всем членам и измените корпус первой буквы. IE, «X» и «Y» переименованы в «xField» и «yField». Любая идея, почему это происходит? Я не могу понять шаблон.Почему WCF иногда добавляет «Поле» к концу сгенерированных типов прокси?

Подробности - У меня есть веб-сервис ASMX, который предоставляет тип «Foo». Я создал новую службу WCF, которая обертывает этот старый веб-сервис - новая служба просто обертывает эти методы и, возможно, обновляет значения нескольких полей, но предоставляет одни и те же методы и возвращает одни и те же типы. Я пытался пересоздать рефери несколько раз, и каждый раз он всегда переименовывает мои поля: varible «STUFF» отображается в wsdl и proxy как «sTUFFField». Переменная «X» отображается как «xField» и т. Д.

Забавно, что я не могу понять шаблон - я попытался создать новый веб-сервис ASMX в качестве теста и обертывания, который - переменные не переименованы тогда. Поэтому я не могу понять, почему/когда WCF переименовывает переменные.

Кто-нибудь знает?

+0

Имеет ли это значение? Если да, то как это важно? –

+2

Это имеет значение. У меня есть два варианта использования (для внутренних и внешних пользователей). Внутренние пользователи могут обойти мою службу обертки и перейти непосредственно к базовому устаревшему сервису (тем самым минуя необходимость входа в систему). Внешние пользователи должны пройти через сервис-обертку и указать пароль и т. Д. Но поскольку внутренние и внешние службы теперь дают разные имена для полей, я не могу использовать один и тот же код для работы с обеими службами. Мне нужно написать разные версии кода для каждой службы. – tavistmorph

ответ

3

Как правило, сгенерированный прокси будет иметь «XField» и «YField» в качестве внутренних/защищенных/закрытых полей и выставлять значения через свойства, называемые «X» и «Y». Я думаю, есть варианты, которые вы можете установить при создании прокси-клиента, чтобы настроить его по своему вкусу.

UPDATE: Кажется, у меня нет никаких переключателей или параметров для управления этим поведением. Это может зависеть от того, какой сериализатор (DataContractSerializer vs. XmlSerializer) использует WCF для создания клиентского прокси.

В конце концов, это действительно более или менее просто проблема стиля кодирования - функционально, это не должно иметь значения.

Марк

+0

Правильно, вот как работает NORMALY, но я вижу, что публичные поля переименованы. Таким образом, внутренние поля называются «XFieldField», а общедоступный аксессор называется «XField». Не то, что я хочу, и это означает, что интерфейс к службе обертки становится иным, чем интерфейс к фактическому сервису. Поэтому я больше не могу обрабатывать две службы взаимозаменяемо. – tavistmorph

+0

Это странно и неожиданно - как вы создаете свой клиентский прокси? В Visual Studio или с помощью svcutil.exe ?? –

+0

Точно - странно и неожиданно. Это происходит только в этом проекте, поэтому я не могу понять шаблон. Но я создал клиентский прокси с помощью Visual Studio, просто нажав «Добавить ссылку на службу». – tavistmorph

4

У меня была такая же проблема, но я был в состоянии найти решение.

В интерфейсе, если вы добавите тэг [DataContractFormat], вы получите «XFieldField». Но если вы замените его на [XmlSerializerFormat] в интерфейсе, он не изменит имена в сгенерированном прокси.

19

У меня была та же проблема, и ответ sergiosp заставил меня возглавить в правильном направлении. Просто добавьте дополнительную информацию, чтобы, надеюсь, помочь кому-то другому.

Добавление [System.ServiceModel.XmlSerializerFormatAttribute()] к интерфейсу и повторное создание кода клиента разрешили проблему для меня.

public interface IMyService 
{ 
    [System.ServiceModel.XmlSerializerFormatAttribute()] 
    [System.ServiceModel.OperationContract] 
    recordResponse GetRecord(recordRequest request); 

} 
+0

спасибо за помощь. Он также решил для меня, но знаете ли вы, что делает этот код и как он решает проблему? – batmaci

+1

@batmaci Когда вы добавляете ссылку на службу в Visual Studio, WCF создает код клиента для вызова службы. По умолчанию он будет использовать DataContractSerializer. Добавление XmlSerializerFormatAttribute заставляет WCF генерировать код с помощью XmlSerializer. Попробуйте добавить ссылку на службу один раз с помощью XmlSerializerFormatAttribute и один раз без нее и сравнить различия в сгенерированном файле кода (Reference.cs). – tgriffin

+0

Я не могу поверить, что этот ответ сидит здесь уже 2 года. Я безумно искал SO и Интернет для этого ответа. Это буквально ответ на мою молитву. В случае, если это будет полезно для вас, людей будущего, которые сталкиваются с этой же проблемой, [здесь] (http://stackoverflow.com/a/20713299/2453110) является ссылкой на мой аналогичный вопрос о создании приемника событий DocuSign для службы уведомлений Connect. –

0

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

Проблема была в том, что я использовал DataContractSerializer для работы с сериализованными запросами на диске (во время проверки нашей службы мы получали сериализованные запросы от поставщика, чтобы иметь возможность отлаживать, прежде чем переходить в прямом эфире).

После изменения DataContractSerializer к XmlSerializer, указывая на его конструктору корневой элемент (по typeof() вызова) и rootnamespace (потому что по умолчанию XmlSerializers написать стандартное пространство имен), я мог бы десериализации запросы и прекрасно работают с Служба WCF.

Надеюсь, это поможет кому-то. Я потерял soooo много раз с этой «проблемой».

Смежные вопросы