Служба WCF, созданная wsdl.exe и предоставляющая закрытые поля в wsdl - PullRequest
2 голосов
/ 21 октября 2009

Я делаю некоторые wsdl- и клиент-ориентированные разработки на 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 должен игнорировать любых закрытых членов. Любые идеи о том, почему это может происходить?

Ответы [ 2 ]

4 голосов
/ 06 октября 2010

Ваши контракты данных используют механизм 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, как показано здесь, не рекомендуется, если у вас нет особых причин для этого, как подробно описано в этом разделе.

2 голосов
/ 21 октября 2009

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

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

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

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

Марк

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