【问题标题】:.NET Core Web API XML with DTD parsing error.NET Core Web API XML 与 DTD 解析错误
【发布时间】:2018-03-25 06:17:39
【问题描述】:

我正在集成中间件 API 服务,该服务接受 XML 请求,解析 XML,然后将其发送到 WorldPay XML API。该应用是在 .NET Core 中开发的。

我创建了与 XML 匹配的类,并在控制器的端点中使用该类作为输入参数。

基于WorldPay XML API docs,有效请求的格式为:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE paymentService PUBLIC "-//Worldpay//DTD Worldpay PaymentService v1//EN"
  "http://dtd.worldpay.com/paymentService_v1.dtd">
<paymentService version="1.4" merchantCode="YOUR_MERCHANT_CODE"> <!--Enter your own merchant code-->
  <submit>
    <order orderCode="YOUR_ORDER_CODE"> <!--Enter a unique order code each time-->
      <description>YOUR DESCRIPTION</description> <!--Enter a description useful to you-->
      <amount currencyCode="GBP" exponent="2" value="5000"/>
      <paymentDetails>
        <CARD-SSL>
          <cardNumber>4444333322221111</cardNumber>
          <expiryDate><date month="01" year="2020"/></expiryDate> 
          <cardHolderName>A Shopper</cardHolderName>
          <cardAddress>
            <address>
              <address1>47A</address1>
              <postalCode>CB94BQ</postalCode>
              <city>Cambridge</city>
              <countryCode>GB</countryCode>
            </address>
          </cardAddress>
        </CARD-SSL>
        <session shopperIPAddress="123.123.123.123" id="0215ui8ib1" /> 
      </paymentDetails>
      <shopper>
        <shopperEmailAddress>ashopper@myprovider.com</shopperEmailAddress>
      </shopper>
    </order>
  </submit>
</paymentService>

API 端点与 WorldPay API 端点应为 1:1。该服务应将商家代码修改为该服务正在使用的商家代码、混淆敏感数据、记录/跟踪它并向 WorldPay 发送请求。

我遇到的问题是,如果请求 XML 在其中包含 !DOCTYPE,我在端点中作为参数创建的类为 null。如果我删除 !DOCTYPE 及其中的信息,则 XML 被解析得很好,并且作为参数的对象是有效的。

我在 swagger 中的端点看起来像这样:

<?xml version="1.0"?>
<paymentService>
  <submit>
    <order>
      <description>string</description>
      <amount>
        <currencyCode>string</currencyCode>
        <exponent>string</exponent>
        <value>string</value>
      </amount>
      <paymentDetails>
        <cardssl>
          <cardNumber>string</cardNumber>
          <expiryDate>
            <date>
              <month>string</month>
              <year>string</year>
            </date>
          </expiryDate>
          <cardHolderName>string</cardHolderName>
          <cardAddress>
            <address>
              <address1>string</address1>
              <postalCode>string</postalCode>
              <city>string</city>
              <countryCode>string</countryCode>
            </address>
          </cardAddress>
        </cardssl>
        <session>
          <shopperIPAddress>string</shopperIPAddress>
          <id>string</id>
        </session>
      </paymentDetails>
      <shopper>
        <shopperEmailAddress>string</shopperEmailAddress>
      </shopper>
      <orderCode>string</orderCode>
    </order>
  </submit>
  <version>string</version>
  <merchantCode>string</merchantCode>
</paymentService>

【问题讨论】:

    标签: c# xml dtd doctype asp.net-core-webapi


    【解决方案1】:

    它可能没有将 XML 解析为它对 DTD 无效。

    您创建的 XML 无效,因为您没有标记界面以告诉它什么是元素以及什么是属性,例如 orderCode 被呈现为元素而不是属性。

    我猜你需要你的界面看起来像这样

    [XmlAttribute]
    public string orderCode { get; set; }
    

    [XmlAttribute("orderCode")]
    public string OrderCode { get; set; }
    

    在您放回 DTD 之前,确保您的 XML 有效,请查看 https://liquid-technologies.com/online-xml-validator

    【讨论】:

    • 这是 XML 的大摇大摆表示的错误,我的类正确标记为 [XmlAttribute]/[XmlElement]
    猜你喜欢
    • 1970-01-01
    • 2016-04-23
    • 2013-02-08
    • 1970-01-01
    • 1970-01-01
    • 2020-11-13
    • 1970-01-01
    • 2014-09-28
    • 2017-11-06
    相关资源
    最近更新 更多