2016-09-12 5 views
1

Я пытаюсь сделать вызов WCF, но я продолжаю получать эту ошибку, когда вызов возвращается клиенту. Я попытался установить все десятичные значения не-нулевых значений, как так:NetDispatcherFaultException: ValueType 'System.Decimal' не может быть нулевым

[FaultContract(typeof(AdaptFaultDetail))] 
    [FaultContract(typeof(BLFaultDetail))] 
    public IRecord SaveRecord(IRecord theRecord, string transactionId, bool reloadRecordAfterSave) 
    { 
     var retVal = GeneralServiceCalls.SaveRecord(theRecord, transactionId, reloadRecordAfterSave); 

     foreach (var property in retVal.GetType().GetProperties()) 
     { 
      if (property.PropertyType == typeof(decimal) && property.GetValue(retVal) == null) 
      { 
       property.SetValue(retVal, 0); 
      } 
     } 

     return retVal; 
    } 

Но я все еще получаю эту ошибку на стороне клиента:

Форматировщик бросил исключение при попытке десериализации сообщение: произошла ошибка при попытке десериализации параметра http://tempuri.org/:SaveRecordResult. Сообщение InnerException было «ValueType» System.Decimal 'не может быть null.'. Дополнительную информацию см. В InnerException.

Внутренняя Исключение:

System.Runtime.Serialization.SerializationException: ValueType 'System.Decimal' не может быть пустым. на ReadAssetCustomFromXml (XmlReaderDelegator, XmlObjectSerializerReadContext, XmlDictionaryString [], XmlDictionaryString [])

Я не знаю, что вызывает ошибку.

+0

Не могли бы вы показать содержимое внутреннего исключения? И, пожалуйста, опубликуйте определение SaveRecordResult. – khlr

+0

Где я могу найти определение для этого? Я думал, что это всего лишь созданная вещь WCF. –

+0

Правильно, SvcUtil.exe создает для вас классы прокси. Поместите курсор где-нибудь на SaveRecordResult и нажмите F12. Вы контролируете обслуживание? – khlr

ответ

0

Это исключение было вызвано сериализатором сообщения, не имеющим той же DLL, что и десериализатор.

В этом случае класс устарел, и в результате отправитель (сериализатор) сериализовал объект, у которого не было десятичного поля, которое ожидало приемник (десериализатор), и исключение было выбрано.

Я не уверен, почему соединение WCF было даже разрешено, но я думаю, что именно так работает WCF.

Смежные вопросы