Созданная wsdl.exe служба WCF, открывающая частные поля в wsdl

Я занимаюсь разработкой wsdl- и client-first на C # с помощью WCF (wsdl и клиент уже существуют, я создаю серверную часть), и у меня возникла странная проблема. Я использовал wsdl.exe для создания контракта из моего .wsdl, и я могу создать его и разместить службу WCF как службу Windows.

Однако wsdl, который я получаю от http://localhost/Service?wsdl, предоставляет частные поля вместо общедоступных свойств. (например: вместо OsType я получаю m_OsTypeField, которая является частной переменной, связанной с общедоступным свойством OsType.)

Вот атрибуты одного из классов, в которых возникла эта проблема: [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.3038")] [System.SerializableAttribute()] [System.Diagnostics.DebuggerStepThroughAttribute()] [System.ComponentModel.DesignerCategoryAttribute("code")] [System.Xml.Serialization.XmlTypeAttribute(Namespace = "http://xxxxxxx.com/")]

Я полностью озадачен, поскольку сериализатор .NET XML должен игнорировать любые частные члены. Есть идеи о том, почему это может происходить?


person oltman    schedule 21.10.2009    source источник


Ответы (2)


Если вы используете WCF, вам следует использовать не wsdl.exe, а svcutil.exe.

Кроме того, стандартный сериализатор WCF DataContract успешно сериализует все, что вы пометили атрибутом [DataMember] - на самом деле настройка видимости .NET не имеет никакого отношения к SOA-представлению ваших данных.

Однако из вашего примера кода может показаться, что вы используете сериализатор Xml, а не DataContractSerializer - вероятно, потому, что вы использовали wsdl.exe вместо svcutil.exe.

Можете ли вы попробовать создать заглушки на стороне сервера с помощью svcutil.exe? Вы все еще видите ту же проблему?

Марк

person marc_s    schedule 21.10.2009
comment
Интерфейс, созданный с помощью SvcUtil.exe с DataContractSerializer, содержит недействительные методы без параметров (методы должны принимать тип запроса и возвращать тип ответа). В дополнение к этому типы данных не создаются. Мне что-то не хватает в SvcUtil? Кроме того, не уверен, имеет ли это значение: если я установил для параметра / ser значение auto, будет использоваться XmlSerializer. - person oltman; 21.10.2009
comment
Обновление: я получил код, сгенерированный SvcUtil.exe, для работы и публикации правильного файла wsdl. Однако пара вопросов: 1) для чего предназначен wsdl.exe, если не для WCF? 2) Что я делал не так с SvcUtil.exe при использовании DataContractSerializer? - person oltman; 22.10.2009
comment
wsdl.exe использовался для старых веб-сервисов ASMX - это технология .NET 1.x / 2.x - почти в прошлом веке ;-) - person marc_s; 22.10.2009
comment
не уверен в DataContractSerializer - это значение по умолчанию, и его следует использовать, но есть определенные условия (и, очевидно, у вашего wsdl было одно из них, я думаю), которые не позволяют WCF использовать DataContractSerializer (например, атрибуты в сообщении XML) а затем он переключится на использование XmlSerializer. - person marc_s; 22.10.2009
comment
Хороший пост об использовании SvcUtil XmlSerializer вместо DataContractSerializer: webservices20.blog .com / 2008/10 / - person oltman; 23.10.2009

Контракты данных используют механизм XmlSerializer, но ваш OperationContract использует DataContractSerializer.

Примените XmlSerializerFormatAttribute в контракте операции

Из MSDN http://msdn.microsoft.com/en-us/library/ms732038(v=VS.90).aspx

Иногда DataContractSerializer не подходит для сериализации ваших типов. WCF поддерживает альтернативный механизм сериализации, XmlSerializer, который также можно использовать для сериализации параметров. XmlSerializer позволяет использовать больший контроль над результирующим XML с помощью таких атрибутов, как XmlAttributeAttribute. Чтобы переключиться на использование XmlSerializer для конкретной операции или для всей службы, примените атрибут XmlSerializerFormatAttribute к операции или службе. Например:

[ServiceContract] 
public interface IAirfareQuoteService
{
    [OperationContract]
    [XmlSerializerFormat]
    float GetAirfare(Itinerary itinerary, DateTime date);
}

Дополнительные сведения см. В разделе Использование класса XmlSerializer. Помните, что вручную переключаться на XmlSerializer, как показано здесь, не рекомендуется, если у вас нет особых причин для этого, как описано в этом разделе.

person sjclark76    schedule 05.10.2010