2017-12-14 8 views
0

ich den Auftrag erhalten haben, unsere C# machen WebAPI immer Fehlerreaktionen mit folgendem Format zurück:httperror ignoriert, wenn eine Fehlermeldung in einem benutzerdefinierten Erstellen von ExceptionFilterAttribute (wenn die Ausnahme in einem anderen Attribut throwed wird)

{ 
    "error": { 
     "code": 15, 
     "message": "My custom error message" 
    } 
} 

davon, weil ich meine eigenen ExceptionFilterAttribute registriert:

public class CustomExceptionFilterAttribute : ExceptionFilterAttribute 
    { 

     class CustomError 
     { 
       public int code { get; set; } 
       public String message { get; set; } 
     } 

public override void OnException(HttpActionExecutedContext context) 
      { 

       if (context.Exception is BaseException) 
       { 
        BaseException exception = (BaseException)context.Exception; 
        HttpError error = new HttpError(); 
        CustomError customError = new CustomError 
        { 
         code=exception.CustomError.code, 
         message=exception.CustomError.message 
        }; 
        error.Add("error", customError); 
        context.Response = context.Request.CreateErrorResponse(HttpStatusCode.InternalServerError, error); 
       } 
       else 
       { 
        context.Response = new HttpResponseMessage(HttpStatusCode.NotImplemented); 
       } 
      } 

Dies funktioniert sehr gut, wenn die Ausnahme in einem Controller throwed wurde. Aber wenn die Ausnahme wurde in einem Attribut (AuthorizeAttribute oder EnableQueryAttribute) throwed, althoug meine Gewohnheit ExceptionFilter genannt wird und der gleiche Code ausgeführt wird, erzeugt die Reaktion der gegebene ignoriert httperror und die Antwort hat den folgenden Aufbau:

{ 
    "error": { 
     "code": "", 
     "message": "" 
    } 
} 

Ich bin nicht sehr geschickt in C#, ich bin mir ziemlich sicher, dass ich etwas falsch mache, aber ich weiß nicht was: S

Vielen Dank im Voraus.

Edit 1:

ich die Anwendung des Attribut, das die Ausnahme bei jeder Methode gibt, wo das Attribut benötigt wird. Zum Beispiel habe ich einen OData-Controller für eine Entität namens „Ereignis“:

[CustomAuthentication] 
    [CustomEnableQueryAttribute(PageSize = 20)] 
    public IQueryable<Event> Get() 
    { 
     (...) 
     return result; 
    } 

Wie gesagt, wenn die Ausnahme im Körper des Reglers throwed, dann wird mein CustomExceptionFilter aufgerufen, und die individuelle Reaktion korrekt erstellt .

Aber wenn die Ausnahme im CustomAuthenticationAttribute oder im CustomEnableQueryAttribute ausgelöst wird, obwohl mein CustomExceptionFilter aufgerufen wird und der gleiche Code ausgeführt wird, ist die Body-Antwort falsch (siehe Beispiel).

+0

wo Sie diese artribute auf Methodenebene angewendet haben ?? –

+0

Hallo, ich habe die Hauptnachricht mit mehr Informationen auf Ihre Frage –

+0

bearbeitet, überprüfen Sie meine Antwort und lassen Sie mich wissen, wenn Sie Hilfe benötigen –

Antwort

1

Filter sind Mittelwerte für nur Controller, aber für globale Fehler müssen Sie den globalen Fehlerfilter in WebAPI verwenden.

Fehler von Attribut geworfen zu handhaben Sie Global Error Hnandler erstellen müssen: https://docs.microsoft.com/en-us/aspnet/web-api/overview/error-handling/exception-handling

class OopsExceptionHandler : ExceptionHandler 
{ 
    public override void HandleCore(ExceptionHandlerContext context) 
    { 
     context.Result = new TextPlainErrorResult//you have to create this class 
     { 
      Request = context.ExceptionContext.Request, 
      Content = "Oops! Sorry! Something went wrong." + 
         "Please contact [email protected] so we can try to fix it." 
     }; 
    } 
} 

gibt es eine Reihe von Fällen, die Ausnahme-Filter sind nicht verarbeiten kann. Zum Beispiel:

  1. Ausnahmen von Controller-Konstruktoren geworfen.
  2. Ausnahmen, die von Nachrichtenhandlern ausgelöst werden.
  3. Ausnahmen beim Routing ausgelöst.
  4. Ausnahmen, die während der Serialisierung des Antwort-Inhalts ausgelöst wurden.
+0

Thankyou Pranay für Ihre Hilfe. Ich habe Ihre Probe mit fest codierten Werten getestet. Und rate was? Die gleiche Sache: Es funktioniert, wenn die Ausnahme in den Controller geworfen wird, funktioniert nicht, wenn das Attribut die Ausnahme auslöst ...: S –

+0

@R.Campos - Sie nicht zu bekommen ... "funktioniert nicht, wenn das Attribut die Ausnahme auslöst" –

+0

Die Beispielmethode hat zwei benutzerdefinierte Attribute, eines für die Authentifizierung und das andere für die Odatabfrage. Was ich meine ist, dass Ihr Beispiel richtig funktioniert, wenn eine Ausnahme in den Controller geworfen wird, nachdem beide Attribute funktioniert haben. Wenn jedoch eines der Attribute eine Ausnahme auslöst, funktioniert Ihr Beispiel nicht, obwohl der Ausnahmefilter aufgerufen und ausgeführt wird. –

Verwandte Themen