Если веб-службы выполняют исключения или объекты результата

Я не уверен, что я полностью счастлив, что отличные исключения в веб-сервисах - хорошая идея. Я бы не возражал, если бы не трассировка стека. Это не то, чего я не хочу.

Я исследовал несколько реализаций, и на самом деле, похоже, нет консенсуса по этому вопросу. CampaignMonitor, например, возвращает объект Result, а другие нет.

Архитектурно, я не уверен, что возвращение объекта возврата имеет смысл, конечно исключение является исключением, но то, что мне нравится в объекте Return, является то, что это более изящное решение для конечного пользователя.

Есть ли у кого-нибудь лучшие решения?

ИЗМЕНИТЬ

BTW Я использую веб-службы ASMX, где включение CustomErrors не является вариантом.

Ответ 1

О какой трассировке стека вы говорите? Вы пробовали это?

В обеих службах ASMX и WCF неперехваченное исключение будет переведено в SOAP Fault. В обоих случаях они могут быть настроены так, чтобы не включать трассировку стека. Фактически, это значение по умолчанию в WCF.

Итак, правильный способ вернуть ошибку, подобную этой, - это ошибка. Один из способов генерации ошибок - это бросить и не обрабатывать исключение.

Ответ 2

Не позволяйте факту, что вы находитесь в веб-сервисе, путают проблему. Это просто деталь реализации.

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

Таким образом, применительно к веб-сервисам - в общем случае исключают исключения (что приводит к SoapFault). Это позволяет вызывающему клиентскому коду использовать встроенный стандарт обработки исключений для его обработки.

Ответ 3

один подход - отделить системные и бизнес-ошибки. (Системная ошибка: например, неверный запрос, неавторизованный пользователь и т.д. Бизнес-ошибка: например, метод UpdateCars приводит к ошибке, пользователь не владеет никакими машинами).

В случае деловой ошибки верните объект ответа, содержащий описание ошибки; в случае системной ошибки выведите исключение.

Ответ 4

Можете ли вы немного уточнить? На стороне сервера веб-службы может возникнуть исключение. Серверная сторона веб-службы может возвращать сообщение на стороне клиента. Это сообщение может содержать информацию об ошибках и что информация об ошибке может конкретно включать в себя сведения об исключении. Или это не так. На стороне клиента обычно создается сгенерированный прокси-сервер для обработки сообщения с сервера. Этот прокси может генерировать исключение, если этот ответ содержит информацию об ошибке.

Какую часть этого сценария вам интересно?

Ответ 5

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

public void MyWebServiceMethod() {
  попробовать
  {

 ///Do something that may cause an error

} catch (Exception ex)
   {       throw new ApplicationException ( "Удобный для пользователя descritption of exception" );

}

}

или вы также можете

catch (исключение ex) {     бросить ex; }

Если вы повторно выбрали исключение, вы скроете исходную трассировку стека от клиентов ваших веб-сервисов.

Ответ 6

Я не понимаю, почему вы не можете сделать то и другое? Поймайте исключение, запишите его (либо в БД, либо в файл), затем верните код ошибки. Таким образом, у вас есть грациозное выполнение вызова webservice, а также уведомление об ошибке, и у вас есть место в другом месте, которое вы можете отлаживать.