2017-10-13 3 views
2

XMLリクエストを受け取り、XMLを解析してWorldPay XML APIに送信するミドルウェアAPIサービスを統合しています。このアプリは.NETコアで開発されています。DTD解析エラーを伴う.NET Core Web API XML

XMLと一致するクラスを作成し、そのクラスをコントローラのエンドポイントで入力パラメータとして使用しています。

WorldPay XML API docsに基づいて、有効なリクエストは、形式です:WorldPayののAPIエンドポイントを1:

<?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でなければなりません。サービスは、マーチャントコードをサービスが使用している商用コードに変更し、機密データを難読化し、ログに記録して追跡し、WorldPayに要求を送信する必要があります。

問題は、リクエストXMLに!DOCTYPEが含まれていると、エンドポイントのパラメータとして作成したクラスでnullになっていることです。 !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> 

答えて

0

その可能性が高いのは、DTDに対してその有効でないとしてXMLを解析していない:闊歩で

私のエンドポイントは、このようになります。

作成しているXMLは、要素の内容と属性を示すインターフェイスをマークアップしていないため有効ではありません。たとえば、orderCodeは属性ではなく要素として表示されます。

私はあなたのXMLが有効であることを確認あなたは後ろにDTDを置く前に、あなたはこの

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

または

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

のようなものを見て、あなたのインターフェースを必要とする推測はhttps://liquid-technologies.com/online-xml-validator

+0

を見てそれはXMLの表現を誇張しているバグです、私のクラスは[XmlAttribute]/[XmlElement] –