簡體   English   中英

將值傳遞給SOAP API復雜類型

[英]Pass value to SOAP API complex type

我使用服務器參考調用SOAP API,有一個復雜的類型需要權重值。 我使用以下代碼設置值:

parcel objpcl = new parcel();
objpcl.weight = 10;
objpcl.length = 10;
objpcl.width = 10;
objpcl.depth = 10;
objpcl.girth = 10;
objpcl.combinedDimension = 10;
objpcl.volume = 10;
objpcl.value = 100;

響應返回並指出“ Invalid Weight”錯誤。 以下是WSDL的詳細信息:

  <xs:complexType name="parcel">
    <xs:sequence>
      <xs:element minOccurs="0" name="weight" type="xs:decimal" />
      <xs:element minOccurs="0" name="length" type="xs:decimal" />
      <xs:element minOccurs="0" name="width" type="xs:decimal" />
      <xs:element minOccurs="0" name="depth" type="xs:decimal" />
      <xs:element minOccurs="0" name="girth" type="xs:decimal" />
      <xs:element minOccurs="0" name="combinedDimension" type="xs:decimal" />
      <xs:element minOccurs="0" name="volume" type="xs:decimal" />
      <xs:element minOccurs="0" name="currency" type="xs:string" />
      <xs:element minOccurs="0" name="value" type="xs:decimal" />
      <xs:element minOccurs="0" name="numberOfParts" type="xs:decimal" />
      <xs:element minOccurs="0" name="numberOfItems" type="xs:decimal" />
      <xs:element minOccurs="0" name="hangingGarment" type="xs:boolean" />
      <xs:element minOccurs="0" name="theftRisk" type="xs:boolean" />
      <xs:element minOccurs="0" name="multipleParts" type="xs:boolean" />
      <xs:element minOccurs="0" name="catalogue" type="xs:boolean" />
      <xs:element minOccurs="0" name="description" type="xs:string" />
      <xs:element minOccurs="0" name="originOfParcel" type="xs:string" />
    </xs:sequence>
  </xs:complexType>

當我使用SOAPUI進行呼叫時,呼叫會完成而不會出現錯誤。 下面是完整的代碼,現在我正在對值進行硬編碼以完成測試,因此任何建議都必須考慮到我將從數據庫值中進行填充的事實。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using HermesWebService;

public partial class _Default : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {

    }
    protected void Button1_Click(object sender, EventArgs e)
    {
        RoutingWebServiceClient objHermesWebService = new RoutingWebServiceClient();
        objHermesWebService.ClientCredentials.UserName.UserName = "ababab";
        objHermesWebService.ClientCredentials.UserName.Password = "abababa";

        deliveryRoutingRequest objRoutingRequest = new deliveryRoutingRequest();
        objRoutingRequest.clientId = "aba";
        objRoutingRequest.clientName = "aba";
        objRoutingRequest.userId = "abababa";
        objRoutingRequest.sourceOfRequest = "ababab";

        delRoutingRequestEntry objReqEntry = new delRoutingRequestEntry();
                objReqEntry.expectedDespatchDate = Convert.ToDateTime("2015-04-10T00:00:00");
    objReqEntry.countryOfOrigin = "US";

        customer objCust = new customer();
        objCust.customerReference1 = "12345";

        address objadr = new address();
        objadr.lastName = "Robinson";
        objadr.streetName = "Eastern Perimeter Road";
        objadr.addressLine1 = "London Heathrow Airport";
        objadr.city = "London";
        objadr.region = "Hounslow";
        objadr.postCode = "TW6 2GE";
        objadr.countryCode = "GB";

        parcel objpcl = new parcel();
        objpcl.weight = 10m;
        objpcl.length = 10m;
        objpcl.width = 10m;
        objpcl.depth = 10m;
        objpcl.girth = 10m;
        objpcl.combinedDimension = 10m;
        objpcl.volume = 10m;
        objpcl.value = 100;

        objCust.address = objadr;
        objReqEntry.customer = objCust;
        objReqEntry.parcel = objpcl;

        objRoutingRequest.deliveryRoutingRequestEntries = new [] {objReqEntry};


        //var request = new delroutingrequestentry
        //{
        //    addressvalidationrequired = false
        //};

        //request.parcel = objpcl;
        //objroutingrequest.deliveryroutingrequestentries[0] = request;

        var x = objHermesWebService.validateDeliveryAddress(objRoutingRequest);

    }
}

運行Microsoft Service Trace Viewer后,似乎Parcel元素未將其加入API調用,這是跟蹤查看器日志的一部分的副本:

<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">
<s:Header>
<ActivityId CorrelationId="58ef72b0-fd4d-475f-9347-5f1ba25f5987" xmlns="http://schemas.microsoft.com/2004/09/ServiceModel/Diagnostics">7f7337fb-8db5-4b84-8e6c-44d7f43d561a</ActivityId>
</s:Header>
<s:Body xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<validateDeliveryAddress xmlns="http://v2.web.domain.routing.hermes.co.uk/">
<deliveryRoutingRequest>
<clientId xmlns="">aba</clientId>
<clientName xmlns="">aba</clientName>
<userId xmlns="">ababab</userId>
<sourceOfRequest xmlns="">ababab</sourceOfRequest>
<deliveryRoutingRequestEntries xmlns="">
<deliveryRoutingRequestEntry>
<customer>
<address>
<lastName>Robinson</lastName>
<streetName>Eastern Perimeter Road</streetName>
<addressLine1>London Heathrow Airport</addressLine1>
<city>London</city>
<region>Hounslow</region>
<postCode>TW6 2GE</postCode>
<countryCode>GB</countryCode>
</address>
<customerReference1>12345</customerReference1>
</customer>
<parcel></parcel>
<expectedDespatchDate>2015-04-10</expectedDespatchDate>
<countryOfOrigin>US</countryOfOrigin>
</deliveryRoutingRequestEntry>
</deliveryRoutingRequestEntries>
</deliveryRoutingRequest>
</validateDeliveryAddress>
</s:Body>
</s:Envelope>

我感到這個問題有一個我忽略的簡單解決方案。 每個十進制字段都有一個對應的字段,以Specified結尾。 Specified字段是一個布爾值,必須將其設置為true才能在序列化期間發送該字段值。 還有其他文章( XmlSerializer,“ Specified”后綴和IReflect )定義了實現此目的的更好方法; 現在,我手動指定:

    var objpcl = new parcel
    {
        weight = 10, weightSpecified = true,
        length = 10, lengthSpecified = true,
        width = 10, widthSpecified = true,
        depth = 10, depthSpecified = true, 
        girth = 10, girthSpecified = true,
        combinedDimension = 10, combinedDimensionSpecified = true,
        volume = 10, volumeSpecified = true,
        value = 100, valueSpecified = true,
        numberOfParts = 1, numberOfPartsSpecified = true,
        numberOfItems = 10, numberOfItemsSpecified = true,            
        description = "Test Package",
        originOfParcel = "US",
    };

如果我花更多的時間查看WSDL文件,我會注意到以下內容:

    [XmlElement(Form = XmlSchemaForm.Unqualified, Order = 0)]
    public decimal weight { get; set; }
    [XmlIgnore]
    public bool weightSpecified { get; set; }

/// <remarks/>
[System.Xml.Serialization.XmlIgnoreAttribute()]
public bool weightSpecified
{
    get
    {
        return this.weightFieldSpecified;
    }
    set
    {
        this.weightFieldSpecified = value;
        this.RaisePropertyChanged("weightSpecified");
    }
}

希望這可以幫助。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM