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

StackOverflow https://stackoverflow.com/questions/1602187

  •  05-07-2019
  •  | 
  •  

Вопрос

Я занимаюсь разработкой 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/")]

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

Это было полезно?

Решение

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

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

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

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

Марк

Другие советы

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

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

Из MSDN http://msdn.microsoft .com / EN-US / библиотека / 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, как показано здесь, не рекомендуется, если у вас нет особых причин для этого, как подробно описано в этом разделе.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top