Я добавил второй метод к моей службе 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: Если бы французское сообщение об ошибке могло быть помещено во что-то, что сворачивает его, я был бы признателен, я не нашел способа сделать это.