Проблемы сериализации .NET WCF

Ситуация: предполагается, что система A предоставляет веб-службу SOAP 1.2 для вызова системы B. Чтобы A знал, как выглядит сообщение, B отправил XSD в A, описывающий содержимое сообщения. A сгенерировал заглушки с помощью инструмента .NET xsd.exe, создал простой веб-сервис вокруг этого, и работа была выполнена.

Однако; когда B вызывает этот веб-сервис, A отказывается сериализовать содержимое SOAP / XML в сгенерированные экземпляры класса прокси. Я понимаю, что это должно быть связано с тем, как сериализация определяется на стороне веб-службы в системе A, но мне не удалось точно определить, что происходит не так.

Как выглядит сообщение от B (анонимно) - ОТКАЗ:

<ns2:Set_Out xmlns:ns2="http://a.a/1.0" xmlns:ns1="http://b.b/1.0" xmlns:ns0="http://c.c">
<Context xmlns="">
    <Foo>test</Foo>
    <Bar>test</Bar>
    ...
</Context>

Как выглядит тестовое сообщение от тестового клиента (на основе WSDL) - РАБОТАЕТ:

<Set_Out xmlns="http://a.a/1.0">
<Context xmlns:b="http://schemas.datacontract.org/2004/07/x.x" xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
    <b:Foo>TEST</b:Foo>
    <b:Bar>test</b:Bar>
    ...
</Context>

Когда веб-сервис, созданный A, получает сообщения из B он вообще не сериализует сообщение. Объекты прокси (например, Context ) имеют значение null . Когда он получает сообщения от тестового клиента, все сгенерировано правильно.

Атрибуты сериализации на прокси:

[System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "2.0.50727.3038")]
[System.SerializableAttribute()]
[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.ComponentModel.DesignerCategoryAttribute("code")]
[System.Xml.Serialization.XmlTypeAttribute(AnonymousType=true, Namespace="http://a.a/1.0")]
[System.Xml.Serialization.XmlRootAttribute(Namespace="http://a.a/1.0", IsNullable=false)]
[System.ServiceModel.MessageContract]
public partial class Set_Out {
    [System.Xml.Serialization.XmlElementAttribute(Namespace="http://a.a/1.0", Form=System.Xml.Schema.XmlSchemaForm.Unqualified)]    [System.ServiceModel.MessageBodyMember(Order=0)]
    public ContextType Context;
    ...

[System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "2.0.50727.3038")]
[System.SerializableAttribute()]
[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.ComponentModel.DesignerCategoryAttribute("code")]
[System.Xml.Serialization.XmlTypeAttribute(Namespace="http://a.a/1.0")]
public partial class ContextType {
[System.Xml.Serialization.XmlElementAttribute(Form=System.Xml.Schema.XmlSchemaForm.Unqualified)]
    public string Foo;

Я считаю странными:

  1. При генерации WSDL для этой службы WSDL добавляет свои собственные пространства имен к определению WSDL ( xmlns: b в примере выше, например).
  2. WSDL не уважает неквалифицированные аннотации, определенные в прокси, и делает все квалифицированным .

I ' пробовал различные комбинации аннотаций, но ничего не помогает; сообщения от B некорректно десериализованы в прокси-серверы, сгенерированные A. Любые идеи / указатели / помощь будут очень признательны!

5
задан tmbrggmn 21 April 2011 в 07:01
поделиться