带有DTD解析错误的.NET核心Web API XML

问题描述:

我正在集成中间件API服务,它接受XML请求,解析XML,然后将其发送到WorldPay XML API。该应用程序是在.NET Core中开发的。带有DTD解析错误的.NET核心Web API XML

我已经创建了与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>[email protected]</shopperEmailAddress> 
     </shopper> 
    </order> 
    </submit> 
</paymentService> 

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

我遇到的问题是,如果请求XML中包含!DOCTYPE,那么对于端点中的参数所做的类为空。如果我删除!DOCTYPE及其中的信息,XML将被很好地解析并且对象作为参数是有效的。

我在招摇端点看起来是这样的:

<?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> 

它可能它不是解析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

+0

这是一个XML的夸大表示的错误,我的类正确标记为[XmlAttribute]/[XmlElement] –