2015-11-26 8 views
3

У меня есть служба рабочего процесса. Я также использую постоянство рабочего процесса в этой службе. Но после того, как я развернул рабочий процесс в IIS, от клиента я делаю запрос к службе рабочего потока, в файле журнала на сервере. Я вижу сообщениеКак исправить 'System.ServiceModel.Channels.ReceivedFault' не может быть сериализован

The execution of the InstancePersistenceCommand named {urn:schemas-microsoft-com:System.Activities.Persistence/command}SaveWorkflow was interrupted by an error.InnerException Message: Type 'System.ServiceModel.Channels.ReceivedFault' cannot be serialized. 
Consider marking it with the DataContractAttribute attribute, and marking all of its members you want serialized with the DataMemberAttribute attribute. 
If the type is a collection, consider marking it with the CollectionDataContractAttribute. See the Microsoft .NET Framework documentation for other supported types. 

Я пробовал исследовать об этом исключении, но я ничего не нашел.

Как исправить эту проблему? или дайте мне знать, в чем причина вышеупомянутого исключения?

+0

Пробовали ли вы, что сообщение об ошибке предложило? – Tim

+0

каждый метод обслуживания в сервисе рабочего процесса, я пытаюсь поймать, но я ничего не получил от этого. –

+0

Вы видите, что один из ваших типов предоставляет свойство типа «System.ServiceModel.Channels.ReceivedFault», которое не может быть сериализовано, потому что класс не помечен атрибутом DataContractAttribute, поэтому он не может быть сериализован. Поэтому отметьте это свойство как игнорируемое. – Will

ответ

4

System.ServiceModel.Channels.ReceivedFault является несериализуемой внутренних классов .NET рамки, так что, к сожалению, нет ничего, что вы можете сделать, чтобы исправить фактическую причину (т.е. решений, сказали класс сериализации).

Возможно, вы вызываете внешнюю службу через WCF, которая вызывает ошибки, то есть вызывается System.ServiceModel.FaultException. IIRC, где-то глубоко в этом FaultException объект является ссылкой на виновника, ReceivedFault экземпляр.

Решение: Поймать все FaultExceptions, передать информацию, которую вы должны знать, из FaultException в сериализуемое исключение, и бросить последний:

try 
{ 
    CallService(); 
} 
catch (FaultException ex) 
{ 
    // Gather all info you need from the FaultException 
    // and transport it in a serializable exception type. 
    // I'm just using Exception and the message as an example. 
    throw new Exception(ex.Message); 
}