Общее исключение для веб-сервисов - PullRequest
3 голосов
/ 15 января 2009

Я интегрируюсь с MS Dynamics GP WebServices из C # и не знаю, как обрабатывать исключения.

Если я выполняю GetCustomer с несуществующим идентификатором, веб-службы возвращают мне «универсальное» исключение SoapException, и появляется сообщение «Бизнес-объект не найден». Таким образом, единственный способ убедиться, что это неверный идентификатор, а не какая-либо другая ошибка, это проанализировать сообщение об ошибке, и я считаю это решение чрезвычайно хрупким. Моя версия GP - английская, на сайте клиента она будет французской, и я понятия не имею, на каком языке будут сообщения веб-сервисов. Я думаю о том, чтобы поймать его, проанализировать сообщение и выдать более значимый тип ошибки.

Вы видите лучший вариант?

Ответы [ 5 ]

1 голос
/ 16 января 2009

К сожалению, и API eConnect, и веб-сервисы GP возвращают общие ошибки, просто будем рады, что вам не нужно разбирать ошибки eConnect.

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

1 голос
/ 16 января 2009

У меня есть сообщение в блоге , в котором подробно описывается, как я преодолел этот вопрос в WCF (хотя, как вы можете видеть, я не против разбора сообщения об ошибке, чтобы получить подробности). Вот мясо этого:

catch (FaultException soapEx)
{
    MessageFault mf = soapEx.CreateMessageFault();
    if (mf.HasDetail)
    {
        XmlDictionaryReader reader = mf.GetReaderAtDetailContents();
        Guid g = reader.ReadContentAsGuid();
    }
}

Когда у вас есть GUID, вы можете использовать его для запроса подробностей об ошибке в веб-службе GP.

0 голосов
/ 09 ноября 2011

Я начинаю ненавидеть ГП. Это может быть "плохой формой", но вот что я сделал:

try
{
    // query service for object by key
}
catch (System.ServiceModel.FaultException e)
{
    if (e.Message == "Business object not found.")
    {
        // create new object
    }
    else
    {
        // log the exception appropriately
    }
}
0 голосов
/ 16 января 2009

Для получения информации для людей, интересующихся темами, ответ Джейкоба Проффитта выглядит как путь. вот отрывок из документации Dynamics GP:

catch(SoapException soapErr)
{
    // If a validation exception occurred, the logid will be in a child node
    if(soapErr.Detail.HasChildNodes == true)
    {
        // Create a guid for the logid value in the soap exception
        Guid guid = new Guid(soapErr.Detail.InnerText);

        // Get the validation result object
        validationResult = wsDynamicsGP.GetLoggedValidationResultByKey(guid, context);

        // Display the number of validation exceptions
        MessageBox.Show("Number of validation exceptions: " +
        validationResult.Errors.Length.ToString());
    }

}

Но в случае, который я привел: GetCustomer с несуществующим идентификатором, строка "soapErr.Detail.HasChildNodes" имеет значение false, поэтому она не работает.

Веб-сервисы кажутся забавными, это займет больше времени, чем я ожидал: (.

0 голосов
/ 16 января 2009

Вы контролируете код WebService?

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

Вы можете использовать перечисление «Коды ошибок» в WebService, чтобы сделать код более читабельным.

//Example
enum ErrorCodes
{
  BusinessObjectNotFound = 1000,
  AnotherPossibleError = 1002
}

try
{
//Code
}
Catch(BusinessObjectNotFoundException bex)
{
  throw new SoapException(ErrorCodes.BusinessObjectNotFound);
  //Or maybe...
  //throw new SoapException(((int)ErrorCodes.BusinessObjectNotFound).ToString());
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...