Рекомендации-выбрасывание исключений из веб-службы
У нас есть веб-служба ASMX, которую мы вызываем из нашего ASP.NET приложение с использованием ajax (jQuery).
Типичным примером из наших веб-методов будет что-то вроде:
[WebMethod]
public void DoSomething(BusinessObject myParameter)
{
try
{
BL.DoSomethingWithParam(myParameter);
}
catch(Exception ex)
{
//logic to log the actual exception goes here
//and then we throw a more user-friendly error as so:
throw new Exception("Unable to perform action such an such");
}
}
На стороне клиента у нас было бы что-то вроде этого:
$.ajax({
type: "POST",
url: "WebService.asmx/DoSomething",
data: "{}",
contentType: "application/json; charset=utf-8",
dataType: "json",
success: function(result) {
//do something with result.d
},
error: function(xhr, ajaxOptions, thrownError){
alert($.parseJSON(xhr.Response.Text).Message);
}
});
Есть несколько проблем с вышеуказанным подходом, которые я хочу исправить:
- Когда мы тестируем наше приложение локально на наших коробках, Internet Explorer отображает фактическое сообщение об ошибке, которое мы выбрасываем на исключение throw new строка на нашем веб-методе (в случае кода примера, предоставленного: "невозможно выполнить действие такое-то") , но , когда мы развертываем в среде stage и тестируем удаленно; он больше не отображает ошибку, которую мы выбрасываем, а скорее это:
"There has been an error processing your request."
- В Firefox (мы больше не тестировали браузеры), он вообще ничего не показывает, но Firebug показывает ошибку HTTP 500, которая выбрасывается.
В заключение мы не рассматриваем это должным образом, поэтому мои вопросы являются:
- Как лучше всего передать эти ошибки на клиентскую сторону и обеспечить согласованное поведение среди всех браузеров, как при локальном, так и удаленном тестировании?
- Почему IE не ломается так же, как Firefox? Конечно, тестирование удаленно IE тоже ломается, не показывая реальное сообщение об ошибке и заменяя его на generic
There has been an error processing your request
, но почему Firefox не делает то же самое? - учитывая тот факт, что этот веб-сервис будет также потребляться другими Java Веб-приложения внутри компании, как лучше всего поддерживать взаимодействие с этими приложениями? Как мы можем все еще бросать эти исключения в наши веб-методы и иметь приложение Java, способное поймать их и обработать их соответствующим образом?
Примечание : не спрашивайте меня откуда приходит сообщение "произошла ошибка при обработке вашего запроса"? У меня нет ни малейшего представления. В нашем коде нет ничего, что могло бы вернуть это сообщение.
1 ответ:
Я не знаю, появился ли еще "правильный" способ из-за того, что способ использования веб-сервисов меняется так быстро, и, в конечном счете, любой клиент, созданный для использования сервиса, способен обрабатывать любой выбранный вами метод. Я не сомневаюсь, что в конечном счете один из них будет изобретен, но пока это зависит от вас.
Тем не менее, постарайтесь избежать некоторых из наиболее распространенных ловушек, которые я видел в прошлом.
- отсутствие согласованности: если ваш веб-сервис имеет несколько методов разрабатывают способ, чтобы все они могли сообщать об ошибках одним и тем же способом, чтобы сделать ваши методы более удобными для использования. Лично я предпочитаю следовать по стопам стеков протоколов и использовать какой-то согласованный заголовок. Создайте результирующие сообщения с общим заголовком, чтобы одна и та же логика могла использоваться во всем коде клиента для определения того, был ли вызов метода успешным.
- Нет поддержки для нескольких сообщений об ошибках: иногда происходит несколько сбоев. Ослепление клиент к вторичной ошибке может быть помехой и замедлять попытки отладки.
- отсутствие идентификации для сообщений об ошибках: если ошибка является результатом того, что определенное поле является недопустимым, позвольте клиенту программно определить, какое поле является виновником на основе предоставленной Вами информации.
Подход, с которого я обычно начинаю в эти дни, выглядит примерно так:
{ Success: bool, Errors[]: { Id: string, Source: string, Message: string }, Message: { *Method specific structure* } }