Могу ли я элегантно запустить каждый ContentResult в контроллере через универсальную попытку / перехват? - PullRequest
3 голосов
/ 28 февраля 2011

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

public ContentResult SomeAction()
{
    try
    {
        //some stuff here
    }
    catch(Exception ex) 
    { 
        HandleErrorMethod(ex);
    }
    return this.Content(someObject.ToXmlString(), contentReturnType);
}        

Это происходит 3-4время в контроллере, поэтому я думаю, что есть способ, которым я могу либо нарисовать его с помощью атрибута, либо запустить какой-то метод в global.asax или что-то в этом роде, чтобы не повторяться снова и снова - не говоря уже об изменениях кода вбудущее.Я действительно понятия не имею, где искать (полагаю, именно поэтому я спрашиваю);Спасибо!

Ответы [ 2 ]

3 голосов
/ 28 февраля 2011

У меня была эта проблема. Я переопределяю метод Controller.OnException , чтобы обрабатывать его по-своему, включая ведение журнала и перенаправление пользователя на страницу ошибки или отображение ошибки JavaScrpt в зависимости от запроса.

Вы можете использовать атрибут HandleError, чтобы заставить это работать с нужными ему действиями.

protected override void OnException(ExceptionContext filterContext)
{

if (filterContext == null)
        return;

var ex = filterContext.Exception; //Your exception
//Now put the rest of your code that is currently in your handle error method. 
}

[HandleError]
public ContentResult SomeAction()
{
   //some stuff here
   return this.Content(someObject.ToXmlString(), contentReturnType);
}   
1 голос
/ 01 марта 2011

В итоге я создал новый ActionFilterAttribute и нарисовал с ним необходимые действия:

public class XmlExceptionAttribute : ActionFilterAttribute, IExceptionFilter
{
    public void OnException(ExceptionContext filterContext)
    {
        if (filterContext.Exception == null) return;

        var response = filterContext.Controller.ControllerContext.HttpContext.Response;
        response.ContentType = "text/xml";
        response.Write((new Status(filterContext.Exception)).ToXmlString());
    }
}

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

[HttpGet]
[XmlException]
public ContentResult Logout(string sessionIdStr)
{
    // do stuff
    // throw exceptions if I need to, they will be handled
    return this.Content(status.ToXmlString(), contentReturnType);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...