2016-06-03 2 views
1

Ich habe einen http-Handler in meinem Server-Side-Code. Alle Antworten gehen durch den Handler. Ich implementiere Code, der überprüft, ob die Antwort auf den Client eine 2xx-Antwort ist, andernfalls (d. H. 404) zu meiner benutzerdefinierten Fehlerseite.Ändern Sie die Antwort, so dass es den Client zu meiner Error.cshtml Seite leitet?

Schließlich werde ich eine andere Fehlerseite haben, abhängig von bestimmten Kriterien, die ich auf die Anfrage und Antwort überprüfe, aber zuerst muss ich nur wissen, wie auf eine einfache error.cshtml Seite in meinen Ansichten umgeleitet werden.

Wie ändere ich die Antwort, so dass es den Client an meine Error.cshtml Seite (in Ansichten) leitet, anstatt zum Beispiel mit einer 404 zu reagieren?

namespace Mymodels.Models 
{ 
    public class myHandler : DelegatingHandler 
    { 
     protected async override Task<HttpResponseMessage> SendAsync(
      HttpRequestMessage request, CancellationToken cancellationToken) 
     {    
      var response = await base.SendAsync(request, cancellationToken); 

      if (!response.IsSuccessStatusCode) //inspects outgoing response to check if status code is 2xx 
      { 
       //do response work here since response is 2xx 
      } 
      else 
      { 
       //How do I modify the reponse to Error.cshtml page?, which is in my Views folder 

      } 
      return response; 
     } 
    } 
} 
+0

Ich glaube, Sie dies sonst hinzufügen 'throw new Httpexception (404, "Nicht gefunden");' und Konfiguration wird ' ' –

+0

@AbdelrhmanMohamed ich glaube nicht, dass für mich arbeiten, weil ich sie auf verschiedene Fehlerseiten je nach dem Inhalt der Anfrage umleiten werde. Das heißt, ich bearbeite den 404-Fehler, indem ich die Anfrage lese und sie auf eine Fehlerseite umgebe, die Informationen darüber enthält, wie man die benötigten Informationen erhält. So wird es verschiedene Fehlerseiten geben, die auf ihre Anfrage zugeschnitten sind. – ConfusedDeer

+0

Ich denke, in diesen Fällen müssen Sie nicht HTTP-Fehlercode verwenden, es sei denn, etwas im Zusammenhang mit wie '404, 403,401' müssen Sie nur Antwort mit dem benötigten HTML-Fehler zurückgeben –

Antwort

0

Meine Lösung HttpContext.Current.Response.RedirectToRoute verwenden war:

namespace Mymodels.Models 
{ 
    public class myHandler : DelegatingHandler 
    { 
     protected async override Task<HttpResponseMessage> SendAsync(
      HttpRequestMessage request, CancellationToken cancellationToken) 
     {    
      var response = await base.SendAsync(request, cancellationToken); 

      if (response.StatusCode != HttpStatusCode.NotFound) //if response is NOT 404 
      { 
       //do response work here since response is not 404 
      } 
      else 
      { 
       response.StatusCode = HttpStatusCode.Redirect; //set status code to 302 
       HttpContext.Current.Response.RedirectToRoute("customErrorRequestPage", "Home"); 

      } 
      return response; 
     } 
    } 
} 
0

Sie könnten den Application_Error-Handler in global.asax verwenden.

protected void Application_Error(object sender, EventArgs e) { 

    Exception exception = Server.GetLastError(); 
    Response.Clear(); 

    HttpException httpException = exception as HttpException; 

    if (httpException != null) { 
     string action; 

     switch (httpException.GetHttpCode()) { 
      case 404: 
       action = "HttpError404"; 
       break; 
      case 500: 
       action = "HttpError500"; 
       break; 
      default: 
       action = "HttpErrorGeneric"; 
       break; 
     } 

     RouteData routeData = new routeData(); 
     routeData.Values.Add("controller", "Error"); 
     routeData.Values.Add("action", action); 
     routeData.Values.Add("Summary","Error"); 
     routeData.Values.Add("Description", ex.Message); 
     IController controller = New ErrorController() 
     controller.Execute(New RequestContext(New HttpContextWrapper(Context), routeData)); 
    } 
} 
Verwandte Themen