Скрытие трассировки стека для исключения, возвращаемого asp.net WebMethod? - PullRequest
1 голос
/ 21 апреля 2009

Я использую методы с Атрибутом [WebMethod] на моих страницах aspx. Я не использую никакой asp.net ajax, но jQuery для вызова этих методов и возврата объектов в JSON. Это все отлично работает.

Затем я добавил проверку авторизации в webMethod, если текущий пользователь не имеет доступа к функции, которая мне нужна, чтобы сообщить вызывающему JavaScript.

Поэтому я выкидываю исключение AccessViolationException, которое затем может быть проанализировано с помощью функции обратного вызова OnError в JavaScript. Это тоже работает, но исключение включает в себя полную StackTrace, и я не хочу делать это доступным для вызывающего клиента.

Какими еще способами я мог бы вернуть клиенту «Отказано в доступе», когда WebMethod возвращает бизнес-объект?

Я использую ASP.Net 3.5SP1 и jQuery 1.32

Ответы [ 5 ]

2 голосов
/ 01 июня 2016

Вы также можете добавить:

customErrors mode="On"/

в вашем web.config, это отрежет трассировку стека и оставит вам только сообщение об исключении

2 голосов
/ 21 апреля 2009

Зачем распространять ошибки по проводам? почему бы не использовать ответ об ошибке?

Просто поместите ваш объект в объект ответа, который может содержать код ошибки для статуса и сообщение об ошибке для представления пользователям.

1 голос
/ 21 апреля 2009

По предложению NunFur я изменил свой подход и вместо того, чтобы выдавать ошибку, я возвращаю «более богатый» объект.

Существует как минимум два варианта, первый из которых заключался бы в инкапсуляции моего бизнес-объекта в объект ответа с некоторыми свойствами состояния. Я попробовал это, но это делает JSON более сложным. Поэтому вместо добавления нового объекта я добавил два свойства в свой бизнес-объект, что-то вроде ServiceStatus и ServiceMessage. По умолчанию это 200 и '', но они могут быть установлены кодом WebMethod, если что-то пойдет не так (нет доступа, правильная ошибка). В этом случае их бизнес-объект будет «пустым» (без данных). Затем код JavaScript сначала проверяет ServiceStatus и реагирует соответствующим образом.

Я добавляю два поля ко всем моим объектам, которые возвращаются WebMethods, даже простую строку. Они должны реализовать интерфейс с этими двумя свойствами.

Теперь у меня есть полный контроль над тем, что происходит по проводам на случай, если произойдет что-то неожиданное.

Спасибо за ввод

0 голосов
/ 21 апреля 2009

Вы можете посмотреть на SoapException: http://msdn.microsoft.com/en-us/library/system.web.services.protocols.soapexception(VS.71).aspx

Я просто не уверен, будет ли это работать при вызове из JavaScript. Особенно если он вызывается с запросом get.

BTW AccessViolationException, насколько мне известно, генерируется, когда приложение обращается к памяти, к которой оно не имеет доступа.

/ Asger

0 голосов
/ 21 апреля 2009

Я сохраняю исключения для случаев, когда дела идут совсем не так. (например, не удается подключиться к базе данных)

Либо ничего не возвращайте (ноль / ноль / что угодно), либо возвращайте ложное значение bool.

Извините, что у меня нет лучшего ответа, чем этот ... Мне придется самому смотреть.

...