将值传递给 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;
响应 returns 和错误说明 "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 字段是一个布尔值,必须将其设置为 true 才能在序列化期间发送字段值。还有其他 post (XmlSerializer, "Specified" suffix and 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");
}
}
希望对您有所帮助。
我正在使用服务器参考调用 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;
响应 returns 和错误说明 "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 字段是一个布尔值,必须将其设置为 true 才能在序列化期间发送字段值。还有其他 post (XmlSerializer, "Specified" suffix and 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");
}
}
希望对您有所帮助。