#c# #asp.net #soap-client
#c# #asp.net #soap-клиент
Вопрос:
Существует веб-сервис (SOAP), который я вызываю. Если я использую инструмент SOAP-UI с теми же значениями, он работает хорошо. Однако, когда я вызываю через код C #, он выдает мне эту ошибку. У меня нет правильного отображения в ASP.Чистый мир.
if ( serviceFee > 0 )
{
surchargeItemsReq SurchargeItemsReqObject = new attachSurchargeItemsRequest()
{
aID = this._applicationId,
tID = token,
provSurcharge = ((decimal)1.8)
};
try
{
this.WriteLog("Invoking Webservice SurchargeItems with ServiceFee");
surchargeItemsResponse SurchargeItemsRespObject = ws.surchargeItems(SurchargeItemsReqObject);
}
Десятичная переменная имела значение 1.8 в качестве значения. Когда я использовал саму переменную, я получаю ту же проблему. Поэтому я буквально вставил туда (десятичный) 1.8. Та же проблема. Пожалуйста, обратите внимание, что в инструменте SoapUI запрос с теми же значениями, которые буквально вводятся, работает хорошо.
Исключение, которое я получаю, заключается в следующем.
System.Web.Services.Protocols.SoapHeaderException was caught
HResult=-2146233087
Message=provSurcharge size is invalid
Source=System.Web.Services
StackTrace:
at System.Web.Services.Protocols.SoapHttpClientProtocol.ReadResponse(SoapClientMessage message, WebResponse response, Stream responseStream, Boolean asyncCall)
at System.Web.Services.Protocols.SoapHttpClientProtocol.Invoke(String methodName, Object[] parameters)
at com.sac.commerce.providers.KanPayService.ServerPaymentPortalService.surchargeItems(surchargeItemsRequest
InnerException:
Вот объект запроса (в сгенерированном Visual Studio коде)
public partial class surchargeItemsReq {
private decimal provSurchargeField;
private bool provSurchargeFieldSpecified;
public decimal provSurcharge {
get {
return this.provSurchargeField;
}
set {
this.provSurchargeField = value;
}
}
Комментарии:
1. какой тип переменной provSurcharge?
2. тип — десятичный
3. почему вы выполняете распаковку с тем же типом?
4. Попробуйте также установить
provSurchargeFieldSpecified
значение true в вашемattachSurchargeItemsRequest
5. @Nonik, из-за паники. Я пробовал без. Это тоже не сработало
Ответ №1:
@HansKilian прокомментировал, сказав, чтобы установить значение логического флага provSurchargeSpecified. После установки значения true это сработало. Кто бы мог подумать?
if ( serviceFee > 0 )
{
surchargeItemsRequest SurchargeItemsReqObject =
new surchargeItemsRequest()
{
provSurcharge = serviceFee,
provSurchargeSpecified = true
};
Интересно, почему только для некоторых полей (bool или десятичных типов) это дополнительное логическое свойство, указанное в поле, генерируется кодом. Сначала я подумал, что смогу найти что-нибудь в WSDL-XSD. Существуют и другие поля типа minOccurs =»0″, в которых не генерируется такой код.
<xs:element minOccurs="0" name="provSurcharge" type="xs:decimal"/>
Комментарии:
1. Это потому, что вы можете определить некоторые типы в службе SOAP, которые не имеют соответствующего типа в C #. В вашем случае это десятичное число с нулевым значением. Я не знаю, почему люди, пишущие прокси-генератор, выбрали отдельный логический индикатор вместо использования
decimal?
. Но они это сделали.