Каков наилучший способ вернуть несколько исключений FaultException из одного вызова WCF? - PullRequest
2 голосов
/ 25 января 2011

Как следует из вопроса, я стараюсь изо всех сил пытаться вернуть несколько исключений FaultException из одного вызова WCF:

Сценарий следующий:
ClientA делает вызов ClientB
ClientB делает много вызовов ServerC, некоторые из которых могут возвращать FaultExceptions

Я хотел бы вернуть все FaultExceptions обратно в ClientA, и я не сталкивался ни с какимихороший способ сделать это.

Я пытался сериализовать и десериализовать как FaultExceptions, так и объекты MessageFault с XmlSerializer, DataContractSerializer и NetDataContractSerializer, но безрезультатно.

Единственные элементы, которые меня действительно волнуют - это Причина, Код и Детали.Мое последнее средство - вручную написать код для сериализации Причины и Кода, но я надеюсь избежать этого.

Есть ли другие способы, по которым мне этого не хватает?

Редактировать: Судя по полученным ответам, я думаю, что мой вопрос не очень ясен

В псевдокоде я пытаюсь сделать следующее:

class ClientA()
{
    Main()
    {
        ClientB.OperateOnManyValues(array[] values)
    }
} 

ClientB()
{
     OperateOnManyValues(array[] values)
     {
         foreach(Val val in values)
         {
             try
             {
                  ServerC.OperateOnOneValue(val)
             }
             catch(FaultException ex)
             {
                 errorList.Add(ex)
             }
         }  
     return errorList
     }
}

Изменить 2:

Прежде всего, я хочу поблагодарить всех за попытку ответить на вопрос.Я чувствую, что некоторые ответы являются ответами на различные проблемы.
Один из авторов предложил мне выдать исключение, как только я получу ошибку.К сожалению, именно так теперь и должна работать система.Каждое оперируемое значение полностью не зависит от других и не зависит от успеха или ошибки других значений.Я не хочу, чтобы одна ошибка влияла на обработку других значений.
Другой автор предложил вернуть какую-то структуру данных со всеми данными FaultException для всех ошибок.Это то, что я хотел бы сделать, но проблема в том, что возвращение списка FaultExceptions выдает ошибки сериализации.Есть ли способ сериализации FaultException, чтобы я мог вернуть несколько в списке из вызова WCF?

Ответы [ 4 ]

2 голосов
/ 26 января 2011

Я бы создал простой класс DataContract со списком исключений в качестве свойства.Затем используйте этот класс в типизированном FaultException <>.

. Я подробно объясню его в двух сообщениях в блоге:

Часть 1 Часть 2

2 голосов
/ 25 января 2011

Просто добавьте контракт на ошибку к каждому из контрактов wcf и отведите исключение в клиенте B, см .: http://msdn.microsoft.com/en-us/library/ms733721.aspx

2 голосов
/ 25 января 2011

Ну ... я не до конца понимаю вторую часть сценария.Если ваш клиент B действует следующим образом

ServerC.A();
[...]
ServerC.B();
[...]
ServerC.C();

или

while(condition)
    ServerC.Call();

, то исключение first автоматически пересылается клиенту B и, возможно, перебрасывается в A, поэтомуу вас нет нескольких исключений для обработки.

Но если ClientB вызывает несколько методов ServerC из разных потоков, у вас может быть что-то подобное.Тем не менее, если ClientB вызывает службы из ServerC, как это

try
{
    ServerC.A();
} catch(Exception ex)
{
    //store exception for A
}
    [...]
try{
    ServerC.B();
} catch(Exception ex)
{
    //store exception for B
}
    [...]
try
{
    ServerC.C();
} catch(Exception ex)
{
    //store exception for C
}

, вы должны обрабатывать их по-своему.

Для того, чтобы иметь согласованное исключение

, которое сообщает информациюЧто касается первопричины, вы должны использовать свойство InnerException класса FaultException, но вы не можете содержать массив InnerExceptions.

Если у вас есть случай, когда вы собираете несколько исключенийи хотите сообщить обо всех

, тогда вы можете создать собственный класс FaultException, унаследованный от первого, со свойством Exception[] InnerExceptions.

Но, опять же, я вам не очень верюесть такого рода «множественные исключения».Возможно, вы имели в виду вложенных исключений, которые должным образом обрабатываются регулярным свойством InnerException.

Если бы вы могли показать нам некоторый псевдокод , это было бы полезно.

1 голос
/ 26 января 2011

Запрос к службе SOAP может вернуть ответ или сбой SOAP. Класс FaultException<T> позволяет возвращать ошибку SOAP.

Нет смысла возвращать несколько ошибок SOAP. Как только ваш вызов в Сервис C вернет ошибку (FaultException), вам, вероятно, следует прекратить работу и вернуть собственную ошибку своему клиенту. Эта неисправность должна быть определена в договоре неисправности для операции.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...