VS2017 Web服务参数获取对象未设置错误
VS2017 Web Services parameter getting object not set error
我在 Visual Studio 中编写了一个 Windows Forms 应用程序,使用 C# 作为我们生产工厂的订购系统。我正在尝试实施一个 SAP Web 服务来为仓库创建转移单,以了解要交付什么 material。
我使用 Visual Studio 2017 年的本地添加服务参考来导入 WSDL。
我已经在 SOAP 中测试了 Web 服务并且它可以工作。
我正在尝试添加必填字段,数量字段附带一个单位代码。在 SOAP 中它看起来像这样。
<RequiredQuantity unitCode="PCE">10</RequiredQuantity>
在 Visual Studio 中,我实例化了我的传输订单和请求,并尝试添加参数,但我一直收到未设置为对象实例的对象引用。
private void btnOrderPallet_Click_1(object sender, EventArgs e) //ops leader tab
{
if (Properties.Settings.Default.UseWebServices == "Yes")
{
try
{
QOE_CreateTO.TransferOrderCreate_InClient transferOrder = new QOE_CreateTO.TransferOrderCreate_InClient("HTTP_Basic_soap12");
transferOrder.ClientCredentials.UserName.UserName = "blah blah";
transferOrder.ClientCredentials.UserName.Password = "blah blah 123";
QOE_CreateTO.TransferOrderCreateRequest toRequest = new QOE_CreateTO.TransferOrderCreateRequest();
//working
toRequest.WarehouseID = "98W";
toRequest.MaterialNumberID = "7516000796";
toRequest.PlantID = "982W";
toRequest.StorageLocationID = "ADPP";
//not working
toRequest.RequiredQuantity.unitCode = "PCE";
toRequest.RequiredQuantity.Value = 10;
//not working either
var qty = toRequest.RequiredQuantity.Value;
var uc = toRequest.RequiredQuantity.unitCode;
qty = 10;
uc = "PCE";
toRequest.RequiredQuantity.unitCode = uc;
toRequest.RequiredQuantity.Value = qty;
//not working either
var rQty = toRequest.RequiredQuantity;
rQty.Value = Convert.ToDecimal(10);
rQty.unitCode = "PCE";
toRequest.RequiredQuantity = rQty;
//working
toRequest.SourceStorageTypeID = "801";
toRequest.SourceStorageBinID = "02-01-01";
toRequest.DestinationStorageTypeID = "PSA";
toRequest.DestinationStorageBinID = "PSA_REMAN";
toRequest.UnloadingPointName = "Reman Line";
toRequest.MovementTypeCode = "919";
toRequest.AutoCreationIndicator = true;
transferOrder.CreateTransferOrder(toRequest);
}
catch (Exception ex)
{
Log.Error(...);
}
}
else
{
}
}
感谢@JHBonarius 要求提供更多详细信息,这里是来自对象浏览器的 get/setter。
public partial class RequiredQuantity : object, System.ComponentModel.INotifyPropertyChanged {
private string unitCodeField;
private decimal valueField;
/// <remarks/>
[System.Xml.Serialization.XmlAttributeAttribute(DataType="token")]
public string unitCode {
get {
return this.unitCodeField;
}
set {
this.unitCodeField = value;
this.RaisePropertyChanged("unitCode");
}
}
/// <remarks/>
[System.Xml.Serialization.XmlTextAttribute()]
public decimal Value {
get {
return this.valueField;
}
set {
this.valueField = value;
this.RaisePropertyChanged("Value");
}
}
public event System.ComponentModel.PropertyChangedEventHandler PropertyChanged;
protected void RaisePropertyChanged(string propertyName) {
System.ComponentModel.PropertyChangedEventHandler propertyChanged = this.PropertyChanged;
if ((propertyChanged != null)) {
propertyChanged(this, new System.ComponentModel.PropertyChangedEventArgs(propertyName));
}
}
}
并且来自 Public 部分 class:
/// <remarks/>
[System.Xml.Serialization.XmlElementAttribute(Form=System.Xml.Schema.XmlSchemaForm.Unqualified, Order=4)]
public RequiredQuantity RequiredQuantity {
get {
return this.requiredQuantityField;
}
set {
this.requiredQuantityField = value;
this.RaisePropertyChanged("RequiredQuantity");
}
}
如有任何帮助,我们将不胜感激。
看起来 WSDL 创建已为您尝试设置的 属性 创建了一个 'object'。
public partial class RequiredQuantity : object
这似乎表明您需要在分配给它包含的 属性 之前实例化此对象。
尝试:
//set object first
toRequest.RequiredQuantity = new RequiredQuantity();
toRequest.RequiredQuantity.unitCode = "PCE";
toRequest.RequiredQuantity.Value = 10;
或者,如果无法解析新引用,请使用内置工具追踪该对象所在的命名空间。这应该允许您设置属性。发生的事情是,您似乎正在尝试设置未实例化对象的子 属性,因此出现“对象未设置错误”。
其他的可以工作,因为它们是简单的字符串并且不包含子对象,因此 WSDL 创建者可以将它们作为简单的基本类型。这个比较复杂,所以需要在赋值之前创建。
我在 Visual Studio 中编写了一个 Windows Forms 应用程序,使用 C# 作为我们生产工厂的订购系统。我正在尝试实施一个 SAP Web 服务来为仓库创建转移单,以了解要交付什么 material。
我使用 Visual Studio 2017 年的本地添加服务参考来导入 WSDL。 我已经在 SOAP 中测试了 Web 服务并且它可以工作。
我正在尝试添加必填字段,数量字段附带一个单位代码。在 SOAP 中它看起来像这样。
<RequiredQuantity unitCode="PCE">10</RequiredQuantity>
在 Visual Studio 中,我实例化了我的传输订单和请求,并尝试添加参数,但我一直收到未设置为对象实例的对象引用。
private void btnOrderPallet_Click_1(object sender, EventArgs e) //ops leader tab
{
if (Properties.Settings.Default.UseWebServices == "Yes")
{
try
{
QOE_CreateTO.TransferOrderCreate_InClient transferOrder = new QOE_CreateTO.TransferOrderCreate_InClient("HTTP_Basic_soap12");
transferOrder.ClientCredentials.UserName.UserName = "blah blah";
transferOrder.ClientCredentials.UserName.Password = "blah blah 123";
QOE_CreateTO.TransferOrderCreateRequest toRequest = new QOE_CreateTO.TransferOrderCreateRequest();
//working
toRequest.WarehouseID = "98W";
toRequest.MaterialNumberID = "7516000796";
toRequest.PlantID = "982W";
toRequest.StorageLocationID = "ADPP";
//not working
toRequest.RequiredQuantity.unitCode = "PCE";
toRequest.RequiredQuantity.Value = 10;
//not working either
var qty = toRequest.RequiredQuantity.Value;
var uc = toRequest.RequiredQuantity.unitCode;
qty = 10;
uc = "PCE";
toRequest.RequiredQuantity.unitCode = uc;
toRequest.RequiredQuantity.Value = qty;
//not working either
var rQty = toRequest.RequiredQuantity;
rQty.Value = Convert.ToDecimal(10);
rQty.unitCode = "PCE";
toRequest.RequiredQuantity = rQty;
//working
toRequest.SourceStorageTypeID = "801";
toRequest.SourceStorageBinID = "02-01-01";
toRequest.DestinationStorageTypeID = "PSA";
toRequest.DestinationStorageBinID = "PSA_REMAN";
toRequest.UnloadingPointName = "Reman Line";
toRequest.MovementTypeCode = "919";
toRequest.AutoCreationIndicator = true;
transferOrder.CreateTransferOrder(toRequest);
}
catch (Exception ex)
{
Log.Error(...);
}
}
else
{
}
}
感谢@JHBonarius 要求提供更多详细信息,这里是来自对象浏览器的 get/setter。
public partial class RequiredQuantity : object, System.ComponentModel.INotifyPropertyChanged {
private string unitCodeField;
private decimal valueField;
/// <remarks/>
[System.Xml.Serialization.XmlAttributeAttribute(DataType="token")]
public string unitCode {
get {
return this.unitCodeField;
}
set {
this.unitCodeField = value;
this.RaisePropertyChanged("unitCode");
}
}
/// <remarks/>
[System.Xml.Serialization.XmlTextAttribute()]
public decimal Value {
get {
return this.valueField;
}
set {
this.valueField = value;
this.RaisePropertyChanged("Value");
}
}
public event System.ComponentModel.PropertyChangedEventHandler PropertyChanged;
protected void RaisePropertyChanged(string propertyName) {
System.ComponentModel.PropertyChangedEventHandler propertyChanged = this.PropertyChanged;
if ((propertyChanged != null)) {
propertyChanged(this, new System.ComponentModel.PropertyChangedEventArgs(propertyName));
}
}
}
并且来自 Public 部分 class:
/// <remarks/>
[System.Xml.Serialization.XmlElementAttribute(Form=System.Xml.Schema.XmlSchemaForm.Unqualified, Order=4)]
public RequiredQuantity RequiredQuantity {
get {
return this.requiredQuantityField;
}
set {
this.requiredQuantityField = value;
this.RaisePropertyChanged("RequiredQuantity");
}
}
如有任何帮助,我们将不胜感激。
看起来 WSDL 创建已为您尝试设置的 属性 创建了一个 'object'。
public partial class RequiredQuantity : object
这似乎表明您需要在分配给它包含的 属性 之前实例化此对象。
尝试:
//set object first
toRequest.RequiredQuantity = new RequiredQuantity();
toRequest.RequiredQuantity.unitCode = "PCE";
toRequest.RequiredQuantity.Value = 10;
或者,如果无法解析新引用,请使用内置工具追踪该对象所在的命名空间。这应该允许您设置属性。发生的事情是,您似乎正在尝试设置未实例化对象的子 属性,因此出现“对象未设置错误”。
其他的可以工作,因为它们是简单的字符串并且不包含子对象,因此 WSDL 创建者可以将它们作为简单的基本类型。这个比较复杂,所以需要在赋值之前创建。