Le contrôle de la WCF format de la réponse et les espaces de noms
Je veux que mon WCF réponse pour avoir un élément de réponse avec deux espaces de noms à l'aide de DataContracts, mais je ne peux pas le faire fonctionner. C'est ce que j'aimerais que la réponse soit:
<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xs="http://www.w3.org/2001/XMLSchema">
<s:Header />
<s:Body>
<ns2:TestReply xmlns="http://www.test.org/test/2007/00" xmlns:ns2="http://www.test2.org/test2/types">
<ns2:Result>
<ns2:ActionSuccessful>true</ns2:ActionSuccessful>
</ns2:Result>
<ns2:ResultData>
<ns2:Name>Maikel Willemse</ns2:Name>
</ns2:ResultData>
</ns2:TestReply>
</s:Body>
</s:Envelope>
C'est la réponse que je reçois (lors de l'essai avec le Client Test WCF):
<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">
<s:Header />
<s:Body>
<GetDataResponse xmlns="http://www.test.org/test/2007/00">
<TestReply xmlns:a="http://www.test2.org/test2/types" xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
<a:Result>
<a:ActionSuccessful>true</a:ActionSuccessful>
</a:Result>
<a:ResultData>
<a:Name>Maikel Willemse</a:Name>
</a:ResultData>
</TestReply>
</GetDataResponse>
</s:Body>
</s:Envelope>
Mon service interface ressemble à ceci:
[ServiceContract(Namespace = "http://www.test.org/test/2007/00")]
public interface IService1
{
[OperationContract]
[return: MessageParameter(Name = "TestReply")]
GetDataResponse GetData(string name);
}
La classe de service:
public class Service1 : IService1
{
public GetDataResponse GetData(string name)
{
return new GetDataResponse
{
Result = new Result {ActionSuccessful = true},
ResultData = new ResultData {Name = name}
};
}
}
Et la DataContract classes sont:
[DataContract(Namespace = "http://www.test2.org/test2/types")]
public class GetDataResponse
{
[DataMember(Name = "Result")]
public Result Result { get; set; }
[DataMember(Name = "ResultData")]
public ResultData ResultData { get; set; }
}
[DataContract(Namespace = "http://www.test2.org/test2/types")]
public class Result
{
[DataMember(Name = "ActionSuccessful")]
public bool ActionSuccessful { get; set; }
}
[DataContract(Namespace = "http://www.test2.org/test2/types")]
public class ResultData
{
[DataMember(Name = "Name")]
public string Name { get; set; }
}
La cible cadre de mon projet WCF est .NET 4. Les préfixes d'espace de noms n'ont pas à être les mêmes. Comment puis-je obtenir la réponse dans le format que je veux?
OriginalL'auteur Maikel Willemse | 2013-03-02
Vous devez vous connecter pour publier un commentaire.
À @Maikel
Le TestReply est dans l'espace de noms par défaut, donc il n'y a pas de préfixe, mais les éléments à l'intérieur de l'ai.
de sorte que le préfixe de cet espace de noms est un. (en raison d'un"=") et c'est différent de l'espace de noms par défaut.
Dans le ServiceContractAttribute de votre méthode
@Carlos suggéré, vous pouvez écrire
Vous ne pouvez pas avoir ce
OriginalL'auteur Elisabeth
Si vous souhaitez supprimer le "wrapping" élément de la réponse, vous aurez besoin d'utiliser un
[MessageContract]
. Le code ci-dessous montre une façon de comment cela peut être fait. Et vous pouvez jouer avec les espaces de noms dans le service /message /contrats de données pour correspondre à ce que vous voulez.Il n'y a pas de moyen simple de personnaliser le préfixes dans le fichier XML généré par la WCF - le préfixe doit être utilisé pour définir l'espace de noms seulement, et vous n'avez généralement pas à choisir le préfixe est utilisé. Si vous voulez vraiment le personnaliser, vous pouvez le faire, mais il n'est pas trivial - la poste à l'adresse blogs.msdn.com/b/carlosfigueira/archive/2010/06/13/... montre une façon de le faire.
Je suis désolé, ce n'est pas ce que je voulais dire. Je ne crains pas le préfixe "un", mais je voudrais que le <TestReply> nœud (de sorte que le premier nœud enfant de l'organisme) pour l'avoir ainsi: <a:TestReply ...>. Lors de l'utilisation de votre code, tous les nœuds à l'intérieur <TestReply> le préfixe (qui est bon), mais le <TestReply> nœud lui-même ne l'est pas.
OriginalL'auteur carlosfigueira