是什么导致本地化成功后已部署服务中的反序列化失败?

时间:2019-06-21 09:36:12

标签: c# xml-deserialization

我在WCF服务中添加了第二种方法。除了接收XML文档,反序列化并调用另一个方法外,它基本上与另一个对象执行相同的工作。它在本地完美运行,我的XML被反序列化并且调用成功。但是,现在我已将其部署在本地服务器上,由于反序列化失败,因此该调用返回500错误。

我的XML文档具有与每个节点关联的名称空间,根和子根元素具有“ ns1”以及所有其他“ ns2”前缀。为了进行反序列化,我(至少到目前为止)对每个节点的名称空间进行了硬编码。

已打包的xml文档:

<ns1:ValiderEtEnrichirGlobalEchangePartage
    xmlns:ns1="API:WebApi"
    xmlns:ns0="http://www.ra.fr/API/Transport/"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
    <ns1:messageGlobal>
        <ns0:AuteurEchange>...</ns0:AuteurEchange>
        <ns0:Documents>
            <ns0:DocumentEchangePartage>...</ns0:DocumentEchangePartage>
        </ns0:Documents>
        <ns0:ExpediteurEchange>...</ns0:ExpediteurEchange>
    </ns1:messageGlobal>
</ns1:ValiderEtEnrichirGlobalEchangePartage>

服务方法中的反序列化过程:

public GlobalEchangePartageValide ValiderEtEnrichirGlobalEchangePartageXML(string xmlMessageGlobal)
{

    XmlRootAttribute xroot = new XmlRootAttribute();
    xroot.ElementName="ValiderEtEnrichirGlobalEchangePartage";
    xroot.Namespace="API:WebApi";

    XmlSerializer serializer = new XmlSerializer(typeof(ValiderEtEnrichirGlobalEchangePartage),xroot );
    StringReader stringReader = new StringReader(xmlMessageGlobal);
    ValiderEtEnrichirGlobalEchangePartage messageGlobal = (ValiderEtEnrichirGlobalEchangePartage)serializer.Deserialize(stringReader);

    return ValiderEtEnrichirGlobalEchangePartage(messageGlobal.GlobalEchangePartage);
}

对应于xml根元素的类:

[XmlRootAttribute("ValiderEtEnrichirGlobalEchangePartage")]
public class ValiderEtEnrichirGlobalEchangePartage
{
    [XmlElement(ElementName=("messageGlobal"))]
    public GlobalEchangePartage GlobalEchangePartage { get; set; }
}

xml子根元素的类:

[DataContract(Namespace = NamespacesConstantes.NAMESPACE_TRANSPORT)]
public class GlobalEchangePartage
{

    [DataMember]
    [XmlElement(ElementName = ("AuteurEchange"), Namespace = "http://www.ra.fr/API/Transport/")]
    public Auteur AuteurEchange { get; set; }

    [DataMember]
    [XmlElement(ElementName = ("ExpediteurEchange"), Namespace = "http://www.ra.fr/API/Transport/")]
    public Auteur ExpediteurEchange { get; set; }

    [DataMember]
    [XmlArray(ElementName="Documents", Namespace = "http://www.ra.fr/API/Transport/")]
    [XmlArrayItem("DocumentEchangePartage")]
    public List<DocumentEchangePartage> Documents { get; set; }

}

我在法语中遇到的错误非常含糊,但可以通过以下方式近似翻译:

WCF error : System.ServiceModel.Dispatcher.NetDispatcherFaultException: The formatting module generated an exception when trying to deserialize the 
message: an error occurred when trying to deserialize the 
API:WebApi:xmlMessageGlobal parameter. The InnerException message was 'An 
error occurred when deserializing the System.String object.   Ending (TN : 
last /final ) element 'xmlMessageGlobal' from the namespace 'API:WebApi' 
expected. Found element 'ns1:ValiderEtEnrichirGlobalEchangePartage' from the 
namespace "API:WebApi'. 

原始:

WCF error : System.ServiceModel.Dispatcher.NetDispatcherFaultException: Le 
module de formatage a généré une exception en tentant de désérialiser le
message : Une erreur s'est produite en tentant de désérialiser le paramètre
API:WebApi:xmlMessageGlobal. Le message InnerException était 'Une
erreur   s'est produite lors de la désérialisation de l'objet de type
System.String.   Élément de fin 'xmlMessageGlobal' provenant de l'espace de 
noms 'API:WebApi' attendu. Trouvé élément
'ns1:ValiderEtEnrichirGlobalEchangePartage' provenant de l'espace de noms 
'API:WebApi'.'. 

注意当它是变量的名称时,如何在XML文档中说'xmlMessageGlobal'...

非常感谢(阅读)!

PS:如果可以将法语错误消息放入会使其崩溃的内容中,我将不胜感激。

1 个答案:

答案 0 :(得分:0)

遇到的问题确实是反序列化问题。但是,这与我编写的代码无关,而是当字符串参数被接收时。因为我的xml文档包装在另一个xml文档中(请求),所以处理中出现问题。通过在Logic App中对我的XML进行base64编码,然后在服务中对其进行解码,我得以解决反序列化问题。

TLDR:通过String参数发送xml时要小心。