Не удалось определить «недопустимый размер» для десятичного аргумента

#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? . Но они это сделали.