Если веб-службы выполняют исключения или объекты результата
Я не уверен, что я полностью счастлив, что отличные исключения в веб-сервисах - хорошая идея. Я бы не возражал, если бы не трассировка стека. Это не то, чего я не хочу.
Я исследовал несколько реализаций, и на самом деле, похоже, нет консенсуса по этому вопросу. 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, а также уведомление об ошибке, и у вас есть место в другом месте, которое вы можете отлаживать.