Что может привести к сбою десериализации в развернутой службе, пока она успешно выполняется локально? - PullRequest
0 голосов
/ 21 июня 2019

Я добавил второй метод к моей службе 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-документе ожидается, что в XML-документе ожидается «xmlMessageGlobal», а это имя переменной ...

Спасибо (за чтение) большое!

PS: Если бы французское сообщение об ошибке могло быть помещено во что-то, что сворачивает его, я был бы признателен, я не нашел способа сделать это.

1 Ответ

0 голосов
/ 24 июня 2019

Проблема, с которой мы столкнулись, действительно была проблемой десериализации.Однако речь шла не о куске кода, который я написал, а о получении строкового параметра.Поскольку мой документ XML был упакован в другой документ XML (запрос), возникли проблемы при обработке.Кодируя base64 мой XML в моем приложении логики и декодируя его в сервисе, я смог решить проблему десериализации.

TLDR: будьте осторожны при отправке xml через параметр String.

...