Question

J'ai le type suivant que j'utilise comme contrat de message dans WCF:

[MessageContract(IsWrapped = true, 
                 WrapperNamespace = "http://example.com/services", 
                 WrapperName = "EchoRequest")]
public class EchoRequest
{
    public EchoRequest() { }
    public EchoRequest(String value)
    {
        Value = value;
    }

    [MessageBodyMember(Name = "Value", 
                       Namespace = "http://example.com/services", 
                       Order = 0)]
    public String Value { get; set; }
}

Quand je génère un proxy à ce type en utilisant svcutil.exe, J'ai un client qui est en mesure de communiquer à un service qui l'héberge, les espaces de noms XML sur les éléments corrects en fonction des attributs du contrat de message.

Quand j'utilise Message.CreateMessage(...) Sur une instance de celui-ci, les espaces de noms reviennent à la valeur par défaut (http://schemas.datacontract.org/2004/07/ ...). Lorsque j'utilise une instance de DataContractSerializer, la même chose se produit. J'essaye de passer un espace de noms au DataContractSerializer Constructeur, et seul l'emballage est inclus dans l'espace de noms:

var requestMessage = new EchoRequest("hello, world!");
var serializer = new DataContractSerializer(typeof(EchoRequest), 
                                            "EchoRequest", 
                                            "http://example.com/services");
var stream = new MemoryStream();
serializer.WriteObject(stream, requestMessage);
var data = Encoding.UTF8.GetString(stream.ToArray());

À ce sujet, "Data" est:

<EchoRequest xmlns="http://example.com/services"
             xmlns:a="http://schemas.datacontract.org/2004/07/TestClient"
             xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
    <a:Value>hello, world!</a:Value>
</EchoRequest>

Pourquoi le DataContractSerializer semblent ignorer le MessageContract les attributs? Comment svcutil Obtenez ce travail?

Était-ce utile?

La solution

C'est parce que les contrats de message ne sont pas des contrats de données, les contrats de données utilisent différents attributs pour marquer leurs classes. Essayez d'utiliser un convertisseur de messages typé;

EchoRequest echoRequest = new EchoRequest{ value = "Hello" };

TypedMessageConverter echoMessageConverter = TypedMessageConverter.Create(
                 typeof(echoRequest),
                 "YourActionNameHere",
                 "http://example.com/services");
Message request = echoMessageConverter.ToMessage(
    echoRequest,MessageVersion.Soap11);

Vous aurez alors un message prêt à partir et pourrez retirer le corps de la demande si vous en avez besoin.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top