[英]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.