2

Ich habe eine LoggingAttribute die Anfrage und Antwort in OnActionExecuted Methode protokolliert:Action an Controller vs Aktionsmethode

public class LoggingAttribute : ActionFilterAttribute 
{ 
    public override void OnActionExecuted(HttpActionExecutedContext httpContext) 
    { 
      //Logger.Log(); 
    } 
} 

Es zur Validierung der Anfrage ein weiteres Attribut ist und das Rück BadRequest. Diese Rückantwort von OnActionExecuting Methode:

public class ValidateModelAttribute : ActionFilterAttribute 
{ 
    public override void OnActionExecuting(HttpActionContext actionContext) 
    { 
     var modelState = actionContext.ModelState; 
     if (!modelState.IsValid) 
     { 
      actionContext.Response = actionContext.Request.CreateErrorResponse(HttpStatusCode.BadRequest, modelState); 
     } 
    } 
} 

Nun, wenn ich beide diese Attribute auf Action-Methode anwenden, mein BadRequest s wird nicht angemeldet, aber wenn ich LoggingAttribute auf Controller-Ebene und ValidateModelAttribute auf Aktionsmethode anwenden, BadRequest s angemeldet zu werden (OnActionExecuted von LoggingAttribute immer genannt).

Kann jemand bitte erklären dieses Verhalten das heißt OnActionExecuted genannt zu werden, selbst wenn Aktionsmethode nicht ausgeführt wird, wenn Attribut an Controller angewendet.

+0

sind Sie Bruchstelle auf LoggingAttribute bekommen, wenn Sie beide –

+0

Attribut anwenden Wenn sowohl auf actionmethod Anwendung - Nein. Wenn LoggingAttribute auf Controllerebene und ValidateModetAttribute bei Aktionsmethode - Ja. – ctor

+0

haben Sie verändern die Reihenfolge auf Action-Methode versucht? – programtreasures

Antwort

1

Ich habe versucht, Sie Szenario wie wie unten an meinem Ende als Ihre

[HttpGet] 
[ValidateModelAttribute] 
[LoggingAttribute] 
public void test() 
{ 
    //throw new NotImplementedException("This method is not implemented"); 
} 

mit dem gleichen Code und ich fand, wie Sie gleiches Problem, Ihre LogginAttribute nicht, weil Sie Ruhe für den Kontext in Ihrem ValidateModelAttribute Einstellung sind aufgerufen erhalten, als Anfrage-Antwort sofort zurück (wegen dieser actionContext.Response =) als Antrag Antwort bekam, und dann tut es auch Sie Methode aufrufen, auf dem Attribut angewendet.

So Lösung für diesen Teil ist Sie OnActionExecuting zu schreiben, die vor Ihrer Validationattribute OnActionExecuting Methode aufgerufen, und Ihr Code wird als OnActionExecuting Methode der LoggingAttribute anmelden, bevor Sie Antwort zurückkehren.

public class LoggingAttribute : ActionFilterAttribute 
{ 
    public override void OnActionExecuting 
     (System.Web.Http.Controllers.HttpActionContext actionContext) 
     { 
      //Logger.Log(); 
     } 

    public override void OnActionExecuted(HttpActionExecutedContext httpContext) 
     { 
      //Logger.Log(); 
     } 
} 

und auch Änderungsauftrag oder ein Attribut, Grund für die weiter unten zu tun ist, wenn Response dann Rückkehr von diesem Punkt nur erhalten in diesem Fall eingestellt ist, so was auch immer Filter in Rohrleitung dort nach als nicht aufgerufen .

[HttpGet] 
[LoggingAttribute] 
[ValidateModelAttribute] 
public void test() 
{ 
    //throw new NotImplementedException("This method is not implemented"); 
} 

wie @programtreasures

+0

Dieses Attribut ist nicht für die Ausnahmeprotokollierung, es wird verwendet, um alle Anforderungen einer API zu protokollieren. Auch die Antwort ist für die Frage irrelevant. – ctor

+0

@ctor - Hallo, aktualisiert meine Antwort, Sie können schauen, die helfen wird ... –

+0

'OnActionExecured' von' LoggingAttribute' wird in dem von Ihnen erwähnten Szenario aufgerufen werden. Bitte überprüfen Sie es erneut. – ctor

2

Sie müssen unten Antwort vorgeschlagen in LoggingAttribute zunächst auf Aktionsmethode anzuwenden,

 [LoggingAttribute] 
     [ValidateModelAttribute]   
     public IEnumerable<string> Get() 
     { 
      return new string[] { "value1", "value2" }; 
     } 
+0

@ programmtreasures - Entschuldigung mein schlechtes, meine Wahl rückgängig gemacht, Sie sind richtig und +1 –

Verwandte Themen