Подтвердить что ты не робот

Почему WCF иногда добавляет "Поле" к концу сгенерированных типов прокси?

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

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

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

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

4b9b3361

Ответ 1

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

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

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

}

Ответ 2

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

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

Ответ 3

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

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

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

Марк

Ответ 4

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

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

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

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