【问题标题】:Deserialize Soap response C#反序列化 Soap 响应 C#
【发布时间】:2018-08-30 11:51:15
【问题描述】:

我的 Soap 响应的反序列化有一些问题,尝试使用 XmlSerializer 类反序列化时出现异常

肥皂数据:

HTTP/1.1 200 OK
Content-Type: application/soap+xml; charset=utf-8
Content-Length: length

<?xml version="1.0" encoding="utf-8"?>
<soap12:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap12="http://www.w3.org/2003/05/soap-envelope">
  <soap12:Body>
    <IsWmsLoginCorrectResponse xmlns="http://pehade.be/">
      <IsWmsLoginCorrectResult>
        <UserId>int</UserId>
        <LoginToken>guid</LoginToken>
        <ErrorId>int</ErrorId>
        <ErrorDescription>string</ErrorDescription>
      </IsWmsLoginCorrectResult>
    </IsWmsLoginCorrectResponse>
  </soap12:Body>
</soap12:Envelope>

TokenInfo 模型:

public const string DefaultSoapNamespace = "http://pehade.be/";

//...

[XmlRoot("IsWmsLoginCorrectResponse", Namespace = Consts.DefaultSoapNamespace)]
    public class TokenInfo : BaseSoapInfo
    {
        [XmlAttribute(AttributeName = "UserId", Namespace = Consts.DefaultSoapNamespace)]
        public int UserId { get; set; }

        [XmlAttribute(AttributeName = "LoginToken", Namespace = Consts.DefaultSoapNamespace)]
        public string LoginToken { get; set; }
    }

public class BaseSoapInfo
    {
        [XmlAttribute(AttributeName = "ErrorId", Namespace = Consts.DefaultSoapNamespace)]
        public int ErrorId { get; set; }

        [XmlAttribute(AttributeName = "ErrorDescription", Namespace = Consts.DefaultSoapNamespace)]
        public string ErrorDescription { get; set; }
    }

解析方法:

public override T ParseSoap<T>(string resultSoap)
        {
            var document = XDocument.Parse(resultSoap);
            var xmlSerializer = new XmlSerializer(typeof(T));

            var soapBody = XName.Get("Body", Consts.DefaultSoapNamespace);

// Exception
            var tokenInfo = (T)xmlSerializer.Deserialize(document.Descendants(soapBody)
                .First()
                .FirstNode
                .CreateReader());         

            return tokenInfo;
        }

我是否正确制作了模型? XmlSerializer 是否有其他方法可以接收流?

更新:添加异常详情

System.InvalidOperationException:序列不包含任何元素 在 System.Linq.Enumerable.First[TSource](System.Collections.Generic.IEnumerable`1[T] 源)[0x00010] 中:0 在 DAL.SoapConverters.LoginSoapConverter.ParseSoap[T] (System.String resultSoap) [0x00031] 在 C:\Work\Projects\Apro\Other MDO\WarehouseMS\DAL\SoapConverters\LoginSoapConverter.cs:40 08-30 14:56 :01.858 I/mono-stdout(4702): System.InvalidOperationException: 序列不包含任何元素

【问题讨论】:

  • 请始终包含所有错误详细信息。如果你有一个例外,那是什么?在哪条线上?有内部异常吗?
  • 我添加了异常详情

标签: c# xml soap deserialization


【解决方案1】:

我认为应该将 XmlAttribute(s) 更改为 XmlElement。例如 UserId 应该是:

[XmlElement(Namespace = Consts.DefaultSoapNamespace)]
public int UserId { get; set; }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-19
    • 2021-07-05
    • 1970-01-01
    • 1970-01-01
    • 2018-03-31
    相关资源
    最近更新 更多