Почему WCF иногда добавляет "Поле" к концу сгенерированных типов прокси?
В принципе, у меня есть серверный тип "Foo" с элементами X и Y. Всякий раз, когда я использую Visual Studio "Добавить серверную ссылку", я вижу, что WSDL и сгенерированный прокси добавляют слово "Поле" ко всем членов и изменить обложку первой буквы. IE, "X" и "Y" переименованы в "xField" и "yField". Любая идея, почему это происходит? Я не могу понять шаблон.
Подробности. У меня есть устаревший веб-сервис ASMX, который предоставляет тип "Foo". Я создал новую службу WCF, которая обертывает эту старую веб-службу - новая служба просто обертывает эти методы и, возможно, обновляет значения нескольких полей, но предоставляет одни и те же методы и возвращает одни и те же типы. Я пытался пересоздать рефери несколько раз, и каждый раз он всегда переименовывает мои поля: varible "STUFF" отображается в wsdl и proxy как "sTUFFField". Переменная "X" отображается как "xField" и т.д.
Забавно, что я не могу понять шаблон - я попытался создать новый веб-сервис ASMX в качестве теста и обертывания, который - переменные не переименовываются. Поэтому я не могу понять, почему/когда WCF переименовывает переменные.
Кто-нибудь знает?
Ответы
Ответ 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 много времени с этой "проблемой".
Ответ 5
Добавление XmlSerializerFormat сработало для меня. Получено решение от http://geekswithblogs.net/mipsen/archive/2010/02/06/field-postfix-in-wcf-reference.aspx
[ServiceContract(Namespace="http://somenamespace.com/contracts")]
public interface ISchemaService
{
[OperationContract]
[XmlSerializerFormat]
void DoSomething(GeneratedType data);
}