Веб-служба не возвращает целочисленные данные в объекте
Возможный дубликат:
Веб-ссылка VS2003 для службы WCF имеет Extra "IdSpecified" Параметр
Спасибо всем. Я полностью пропустил это. Да, название класса ужасно.
У меня есть веб-служба (ASMX), которая возвращает объект, содержащий массив.
Сначала я определяю свой объект ответа:
APIResponse response = new APIResponse();
Заполните данные:
dtHolder = SqlHelper.ExecuteDatatable(connstring, CommandType.StoredProcedure, strSelect, aParams);
Создайте держатель для результатов моего запроса:
API036RsBkgDetRec[] BkgDetRec_Array = new API036RsBkgDetRec[dtHolder.Rows.Count];
int i = 0;
foreach (DataRow row in dtHolder.Rows)
{
BkgDetRec_Array[i] = new API036RsBkgDetRec();
BkgDetRec_Array[i].eqoEqszId = row[0].ToString();
BkgDetRec_Array[i].eqoEqtpId = row[1].ToString();
BkgDetRec_Array[i].eqoEqhtId = row[2].ToString();
BkgDetRec_Array[i].qty = Convert.ToInt32(row[3]);
BkgDetRec_Array[i].receiveQty = Convert.ToInt32(row[4]);
BkgDetRec_Array[i].emptyTally = Convert.ToInt32(row[5]);
BkgDetRec_Array[i].maxEmpty = Convert.ToInt32(row[6]);
BkgDetRec_Array[i].chsQty = Convert.ToInt32(row[7]);
BkgDetRec_Array[i].chsTally = Convert.ToInt32(row[8]);
i++;
}
и заполнить массив, который я возвращаю (bkgDetTable), с массивом держателя, который я только что заполнил выше:
response.bkgDetTable = BkgDetRec_Array;
Когда я фиксирую вывод, я вижу, что ни одно из целочисленных полей не создается, хотя, когда я просматриваю код, они заполняются действительными числами. Объект API036RsBkgDetRec также определяет их как целочисленные значения. Только те, которые определены как строка, пересекаются.
<bkgDetTable xmlns="http://sdfsd/xsd">
<eqoEqhtId>96</eqoEqhtId>
<eqoEqszId>40</eqoEqszId>
<eqoEqtpId>DR</eqoEqtpId>
</bkgDetTable>
Вот определение API036RsBkgDetRec:
public partial class API036RsBkgDetRec
{
private int chsQtyField;
private bool chsQtyFieldSpecified;
private int chsTallyField;
private bool chsTallyFieldSpecified;
private int emptyTallyField;
private bool emptyTallyFieldSpecified;
private string eqoEqhtIdField;
private string eqoEqszIdField;
private string eqoEqtpIdField;
private int maxEmptyField;
private bool maxEmptyFieldSpecified;
private int qtyField;
private bool qtyFieldSpecified;
private int receiveQtyField;
private bool receiveQtyFieldSpecified;
/// <remarks/>
[System.Xml.Serialization.XmlElementAttribute(Order=0)]
public int chsQty
{
get
{
return this.chsQtyField;
}
set
{
this.chsQtyField = value;
}
}
/// <remarks/>
[System.Xml.Serialization.XmlIgnoreAttribute()]
public bool chsQtySpecified
{
get
{
return this.chsQtyFieldSpecified;
}
set
{
this.chsQtyFieldSpecified = value;
}
}
/// <remarks/>
[System.Xml.Serialization.XmlElementAttribute(Order=1)]
public int chsTally
{
get
{
return this.chsTallyField;
}
set
{
this.chsTallyField = value;
}
}
/// <remarks/>
[System.Xml.Serialization.XmlIgnoreAttribute()]
public bool chsTallySpecified
{
get
{
return this.chsTallyFieldSpecified;
}
set
{
this.chsTallyFieldSpecified = value;
}
}
/// <remarks/>
[System.Xml.Serialization.XmlElementAttribute(Order=2)]
public int emptyTally
{
get
{
return this.emptyTallyField;
}
set
{
this.emptyTallyField = value;
}
}
/// <remarks/>
[System.Xml.Serialization.XmlIgnoreAttribute()]
public bool emptyTallySpecified
{
get
{
return this.emptyTallyFieldSpecified;
}
set
{
this.emptyTallyFieldSpecified = value;
}
}
/// <remarks/>
[System.Xml.Serialization.XmlElementAttribute(IsNullable=true, Order=3)]
public string eqoEqhtId
{
get
{
return this.eqoEqhtIdField;
}
set
{
this.eqoEqhtIdField = value;
}
}
/// <remarks/>
[System.Xml.Serialization.XmlElementAttribute(IsNullable=true, Order=4)]
public string eqoEqszId
{
get
{
return this.eqoEqszIdField;
}
set
{
this.eqoEqszIdField = value;
}
}
/// <remarks/>
[System.Xml.Serialization.XmlElementAttribute(IsNullable=true, Order=5)]
public string eqoEqtpId
{
get
{
return this.eqoEqtpIdField;
}
set
{
this.eqoEqtpIdField = value;
}
}
/// <remarks/>
[System.Xml.Serialization.XmlElementAttribute(Order=6)]
public int maxEmpty
{
get
{
return this.maxEmptyField;
}
set
{
this.maxEmptyField = value;
}
}
/// <remarks/>
[System.Xml.Serialization.XmlIgnoreAttribute()]
public bool maxEmptySpecified
{
get
{
return this.maxEmptyFieldSpecified;
}
set
{
this.maxEmptyFieldSpecified = value;
}
}
/// <remarks/>
[System.Xml.Serialization.XmlElementAttribute(Order=7)]
public int qty
{
get
{
return this.qtyField;
}
set
{
this.qtyField = value;
}
}
/// <remarks/>
[System.Xml.Serialization.XmlIgnoreAttribute()]
public bool qtySpecified
{
get
{
return this.qtyFieldSpecified;
}
set
{
this.qtyFieldSpecified = value;
}
}
/// <remarks/>
[System.Xml.Serialization.XmlElementAttribute(Order=8)]
public int receiveQty
{
get
{
return this.receiveQtyField;
}
set
{
this.receiveQtyField = value;
}
}
/// <remarks/>
[System.Xml.Serialization.XmlIgnoreAttribute()]
public bool receiveQtySpecified
{
get
{
return this.receiveQtyFieldSpecified;
}
set
{
this.receiveQtyFieldSpecified = value;
}
}
}
Любые идеи?
Ответы
Ответ 1
Для всех полей INT
у вас есть два поля:
-
фактическое поле INT
, которое, я уверен, вы уже установили для правильного значения (private int emptyTallyField;
)
-
но у вас также есть поле с именем private bool emptyTallyFieldSpecified;
, для которого должно быть установлено true
- в противном случае значение int, которое вы установили , не будет сериализоваться
Причина этого заключается в том, что для поля ссылочного типа, такого как поле string
, вы можете иметь NULL
для представления аспекта "нет значения", и вы можете иметь пустую строку или любую другую строку там.
Для типов значений, например INT
- как иначе вы бы указали "нет значения, указанного" в случае? Если вы установите для поля int значение 0 - это значение 0, потому что вы хотите, чтобы это значение равно нулю, или это "0", потому что вы действительно хотите сказать "нет значения". По этой причине все типы значений имеют это дополнительное свойство (fieldname)specified
, которое указывает, присутствует ли фактическое значение. Если этот указанный флаг не установлен (и он не задан по умолчанию), то у вас нет значения - таким образом, ничто не сериализуется.
Ответ 2
Вы заметите, что для каждого типа значения свойства (integer, double, DateTime,...) у вас есть свойство XXXSpecified
boolean. Например, у вас есть:
public int maxEmpty
и
public bool maxEmptySpecified
Эти свойства генерируются при импорте веб-службы WCF с помощью wsdl.exe(или Добавить веб-ссылку в Visual Studio). Вы должны установить для них значение true
каждый раз, когда вы устанавливаете соответствующее значение свойства типа значения.
Я согласен, что это полное дерьмо, но, как это. Теперь ASMX устарел.