Как прервать запрос ASMX на основе логики в конструкторе? - PullRequest
2 голосов
/ 13 июля 2010

У меня есть общий базовый класс, от которого будут наследоваться все мои классы веб-сервиса ASMX.В конструкторе я хочу сделать некоторые общие проверки подлинности;если они терпят неудачу, я хотел бы немедленно прекратить обработку (код подкласса не будет выполнен) и вернуть вызывающему абоненту ответ кода состояния 401.

Однако, распространенные ASPX-подобные способы сделать этоне похоже на работу:

  1. Context.Response.End ();всегда возвращает вызывающему исключение ThreadAborted в ответе с кодом состояния 500.Даже если я явно установлю Context.Response.StatusCode = 401 перед вызовом End (), он игнорируется.Результатом по-прежнему является 500-ответный ответ, а сообщение всегда «исключение прерывания потока».
  2. MSDN предлагает вместо этого использовать HttpContext.Current.ApplicationInstance.CompleteRequest ().Однако это не останавливает последующую обработку: функции моего подкласса по-прежнему выполняются так, как будто конструктор ничего не сделал.(Вид поражает цель проверки авторизации в конструкторе.)
  3. Я могу выдать новое исключение HttpException.Это немного лучше, поскольку он предотвращает последующую обработку и, по крайней мере, дает мне контроль над сообщением об исключении, возвращаемом вызывающей стороне.Однако он не идеален в том смысле, что ответ по-прежнему всегда равен 500.
  4. Я могу определить экземпляр DoProcessing var и установить для него значение true / false в конструкторе.Затем пусть каждый WebMethod в каждом подклассе обернет свою функциональность в блок if (DoProcessing) ... но давайте посмотрим правде в глаза, это отвратительно!

Есть ли лучший / более тщательный способ реализации этогочто-то вроде функциональности, так что это общее для всех моих классов ASMX?

edit : Принятие ответа Джона, так как это, вероятно, лучший подход.Однако из-за нежелания клиента принять дополнительный сторонний код и некоторой степени FUD с AOP мы не воспользовались этим подходом.В итоге мы остановились на варианте № 3, описанном выше, так как он, казалось, достиг наилучшего баланса между скоростью внедрения и гибкостью и по-прежнему соответствовал требованиям.

Ответы [ 2 ]

0 голосов
/ 05 апреля 2017
 Context.Response.Write("My custom response message from constructor");
 Context.Response.StatusCode = (int)HttpStatusCode.Forbidden;       
 Context.Response.End();

Этот код запрещает передавать в веб-метод после конструктора.

0 голосов
/ 13 июля 2010

Лучший способ сделать это - переключиться на WCF, который явно поддерживает такой сценарий.

Если вы все еще должны использовать ASMX, тогда лучше всего вызывать методы базового класса изкаждый веб-метод.Возможно, вы захотите использовать что-то вроде PostSharp, чтобы «волшебным образом» заставить все ваши веб-методы вызывать метод базового класса.

...