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

What could cause a deserialization in a deployed service to fail while it succeeds localy?

我向我的 WCF 服务添加了第二种方法。除了接收 xml 文档、反序列化它并调用另一个方法外,它基本上与另一个执行相同的工作。它在本地完美运行,我的 XML 被反序列化并且调用成功。但是,现在我已经将它部署在我的本地服务器上,调用 returns 出现 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根元素的class:

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

xml子根元素的class:

[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 : 如果可以将法语错误消息放在崩溃它的东西中,我将不胜感激,我没有找到这样做的方法。

遇到的问题确实是反序列化问题。但是,这与我编写的代码无关,而是在收到字符串参数时。因为我的 xml 文档被包裹在另一个 xml 文档(请求)中,所以处理过程中出现了问题。通过在我的逻辑应用程序中对我的 XML 进行 base64 编码,并在服务中对其进行解码,我能够解决反序列化问题。

TLDR:通过字符串参数发送 xml 时要小心。