Miroslav Holec

Software & Cloud Architect

miroslavholec.cz / blog / globalni-filtry-mvc-vs-web-api

Globální filtry MVC vs. Web API

Miroslav Holec

Miroslav Holec

Publikován 19. září 2014 , aktualizace: 29. března 2016

Tento článek je starší 18 měsíců a je proto možné, že popisuje postupy nebo technologie, které v uplynulé době mohly doznat výraznějších změn. Názory a myšlenky v tomto článku již nemusí vyjadřovat současné stanovisko autora nebo autorů. Článek byl napsán 19. září 2014.

Registrace globálních filtrů u MVC projektů a projektů Web API se trochu liší. Zde je shrnutí rozdílů, ukázané na filtru použitelném pro logování chyb.

MVC

Seznam filtrů je v kolekci GlobalFilters.Filters a tentokrát se jedná o kolekci typu GlobalFilterCollection. Tato kolekce tedy umožňuje enumerovat jednotlivými Filter objekty.

Global.asax

protected void Application_Start()
{
	FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
}

App_Start/FilterConfig.cs

public class FilterConfig
{
    public static void RegisterGlobalFilters(GlobalFilterCollection filters)
    {
        filters.Add(new HandleMvcError());
    }
}

HandleMvcError.cs

public class HandleMvcError : ActionFilterAttribute
{
    public override void OnActionExecuted(ActionExecutedContext filterContext)
    {
		// log error here
	}
}

WebApi

Seznam filtrů je uložen v kolekci GlobalConfiguration.Configuration.Filters a jedná se o kolekci typu HttpFilterCollection. Umožňuje enumerovat jednotlivými FilterInfo objekty.

Global.asax

protected void Application_Start()
{
	FilterConfig.RegisterGlobalFilters(GlobalConfiguration.Configuration.Filters);
}

App_Start/FilterConfig.cs

public class FilterConfig
{
    public static void RegisterGlobalFilters(HttpFilterCollection filters)
    {
        filters.Add(new HandleWebApiError());
    }
}

HandleWebApiError.cs

public class HandleWebApiError : ExceptionFilterAttribute
{
    public override void OnException(HttpActionExecutedContext filterContext)
    {
        throw new HttpResponseException(new HttpResponseMessage(HttpStatusCode.InternalServerError)
        {
            Content = new StringContent(filterContext.Exception.Message),
            ReasonPhrase = "Internal server error"
        });
    }
}

Potřebujete pomoci?

Líbil se Vám článek? Máte dotaz nebo chcete v této oblasti s něčím pomoci? Neváhejte se na mě obrátit.

mirek@miroslavholec.cz

  • Řešení vývojářských problémů
  • Konzultace
  • Firemní školení a workshopy