Heim  >  Artikel  >  Backend-Entwicklung  >  asp.net ActionFilter-Filter

asp.net ActionFilter-Filter

巴扎黑
巴扎黑Original
2017-09-01 14:41:371690Durchsuche

In diesem Artikel wird hauptsächlich der ActionFilter-Filter des asp.net-Kern-MVC-Filters ausführlich vorgestellt, der einen gewissen Referenzwert hat.

Diese Klassenreihe erklärt die Verwendung des integrierten Filter in asp.net core MVC werden in die folgenden Kapitel unterteilt:

 asp.net core MVC filter ExceptionFilter filter (1)

 asp.net core MVC Filter ActionFilter filter (2)

asp.net-Kern-MVC-Filter ResultFilter-Filter (3)

asp.net-Kern-MVC-Filter ResourceFilter-Filter (4)

 AuthorizationFilter-Filter des asp.net-Kern-MVC-Filters (5)

Einführung

Der Aktionsfilter wird vor und nach der Aktion des Controllers ausgeführt. Führen Sie die entsprechende Methode aus.

Implementieren eines benutzerdefinierten Aktionsfilters

Das Anpassen eines globalen Ausnahmefilters erfordert die Implementierung der IActionFilter-Schnittstelle


public class ActionFilter : IActionFilter
{
  public void OnActionExecuted(ActionExecutedContext context)
  {
    Console.WriteLine("action执行之后");
  }

  public void OnActionExecuting(ActionExecutingContext context)
  {
    Console.WriteLine("action执行之前");
  }
}

IActionFilter muss zwei Methoden implementieren: OnActionExecuted und OnActionExecuting. OnActionExecuting wird vor Action ausgeführt und OnActionExecuted wird nach Action ausgeführt.

Nachdem wir das Prinzip kennen, können wir seine Funktionen verwenden, um unseren Code zu vereinfachen. Wir definieren Modelleinschränkungen und überprüfen dann, ob das Modell erfolgreich gebunden ist Folgender Code in unserer Aktion


[HttpGet]
public ActionResult Get()
{
  if (!ModelState.IsValid) return BadRequest("参数错误!");
}

Ein solcher wiederholter Code erhöht nicht nur die Komplexität des Codes, sondern sieht auch unansehnlich aus. Wir können ihn automatisch in ActionFilter vervollständigen


public void OnActionExecuting(ActionExecutingContext context)
{
  if (context.ModelState.IsValid) return;

  var modelState = context.ModelState.FirstOrDefault(f => f.Value.Errors.Any());
  string errorMsg = modelState.Value.Errors.First().ErrorMessage;
  throw new AppException(errorMsg);
}

Wenn der Modellbindungsfehler auftritt, werfen wir Ausnahmeinformationen aus, erfassen sie im Ausnahmefilter ExceptionFilter im vorherigen Kapitel und geben die Fehlerinformationen an den Anforderer zurück.

Wir können auch die Funktionen von ActionFilter verwenden, um die Ausführungszeit einer Aktion aufzuzeichnen und ein Warnprotokoll auszugeben, wenn die Ausführungszeit der Aktion zu langsam ist


public class ActionFilter : IActionFilter
{
  public void OnActionExecuted(ActionExecutedContext context)
  {
    var httpContext = context.HttpContext;
    var stopwach = httpContext.Items[Resources.StopwachKey] as Stopwatch;
    stopwach.Stop();
    var time = stopwach.Elapsed;

    if (time.TotalSeconds > 5)
    {
      var factory = context.HttpContext.RequestServices.GetService<ILoggerFactory>();
      var logger = factory.CreateLogger<ActionExecutedContext>();
      logger.LogWarning($"{context.ActionDescriptor.DisplayName}执行耗时:{time.ToString()}");
    }
  }

  public void OnActionExecuting(ActionExecutingContext context)
  {
    var stopwach = new Stopwatch();
    stopwach.Start();
    context.HttpContext.Items.Add(Resources.StopwachKey, stopwach);
  }
}

Oben Der Code verwendet HttpContext, um einen Stopwach zu übergeben, um die Ausführungszeit der Aktion zu berechnen, und gibt ein Warnprotokoll aus, wenn diese 5 Sekunden überschreitet.

Globalen Filter registrieren

Die Registrierungsmethode ist die gleiche wie bei ExceptionFinter. Suchen Sie die Datei „Startup.cs“ im Stammverzeichnis des Systems und ändern Sie „ConfigureServices“ wie folgt:


services.AddMvc(options =>
      {
        options.Filters.Add<ActionFilter>();
      });

Das obige ist der detaillierte Inhalt vonasp.net ActionFilter-Filter. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn