Как добавить префикс XML к полям в сериализации сообщений WCF? - PullRequest
3 голосов
/ 30 сентября 2010

Как добавить префикс XML к полям в сериализации сообщений WCF?

Я подключаюсь к веб-службе Java Spring из .NET, и объект, который я передаю с параметрами, сериализуется, как и следовало ожидать:

<MyClass>
  <field1>Field 1 Value</field1>
  <field2>Field 2 Value</field2>
</MyClass>

Тем не менее, веб-сервис требует, чтобы класс и поля имели префикс пространства имен, скажем, пространство имен blah, поэтому я хочу:

<blah:MyClass>
  <blah:field1>Field 1 Value</blah:field1>
  <blah:field2>Field 2 Value</blah:field2>
</blah:MyClass>

Как я могу сделать это в WCF? Есть ли способ настроить атрибуты сериализации XML в моем классе?

Редактировать: WSDL для этой конкретной сущности выглядит следующим образом (отредактировано для удаления специфичных для бизнеса имен полей, но все остальное остается тем же):

<wsdl:definitions xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns:sch0="http://www.domain.com/app/schemas/entityone" xmlns:sch1="http://www.domain.com/app/schemas/types" xmlns:sch2="http://www.domain.com/app/schemas/query" xmlns:sch3="http://www.domain.com/app/schemas/entitytwo" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:tns="http://www.domain.com/app/schemas/entityone" targetNamespace="http://www.domain.com/app/schemas/entityone">
  <wsdl:types>
  <schema xmlns="http://www.w3.org/2001/XMLSchema" xmlns:types="http://www.domain.com/app/schemas/types" attributeFormDefault="qualified" elementFormDefault="qualified" targetNamespace="http://www.domain.com/app/schemas/entityone" xmlns:tns="http://www.domain.com/app/schemas/entityone">
  <import namespace="http://www.domain.com/app/schemas/types" /> 

<element name="TheClassName">
 <complexType>
  <sequence>
   <element name="field1" type="string" /> 
   <element name="field2" type="string" /> 
   <element name="field3" type="string" /> 
   <element name="field4" type="string" /> 
   <element name="field5" type="string" /> 
   <element name="field6" type="string" /> 
   <element name="field7" type="string" /> 
   <element name="field8" type="string" /> 
  </sequence>
 </complexType>
</element>

<wsdl:binding name="NameOfBindingHere" type="tns:ReturnTypeHere">
  <soap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http" /> 
   <wsdl:operation name="OperationNameHere">
     <soap:operation soapAction="" /> 
     <wsdl:output name="ResponseTypeHere">
        <soap:body use="literal" /> 
     </wsdl:output>
   </wsdl:operation>
</wsdl:binding>

Ответы [ 2 ]

1 голос
/ 01 октября 2010

Я думаю, что вы путаете пространства имен и префиксы. В вашем примере Blah - это префикс и указатель (псевдоним) на пространство имен. В документе вы увидите атрибут xmlns: blah = "http://tempuri/your/namespace",, префикс - blah, а пространство имен - http://tempuri/your/namespace.

То, какой префикс используется, не имеет значения, кто бы ни потреблял документ, если он указывает на одно и то же точное пространство имен.

так

<blah:MyClass xmlns:blah="http://tempuri/your/namespace"></blah:MyClass>

- это то же самое, что и

<blah1:MyClass xmlns:blah1="http://tempuri/your/namespace"></blah1:MyClass>

XML-схема не требует использования префикса.

Пример DataContract от Aliostad - это способ определения пространства имен, которое будет использовать Сериализатор контрактов данных. Невозможно определить, какой префикс будет использовать DataContract Serializer, потому что какой бы ни был префикс, это не имеет значения. До тех пор, пока сервис, потребляющий этот XML, соответствует стандартам XML (и не является чем-то вроде выражения RegEx, и поверьте мне, я видел множество случаев, когда потребителем XML был пользовательский анализатор письменного текста вместо используя синтаксический анализатор XML и не понял концепцию пространств имен XML и информационных наборов).

0 голосов
/ 30 сентября 2010

Попробуйте определить MyClass как:

DataContract(namespace="blah")
Class MyClass
{
   [DataMember]
   Field1 ...

   [DataMember]
   Field2 ...
}

UPDATE Это не создаст префикс, но префикс не понадобится, если XML имеет правильное пространство имен и Java должна работать.

...