修改响应,以便将客户端路由到我的Error.cshtml页面?

时间:2016-06-03 17:33:42

标签: c# asp.net-mvc-4 model-view-controller

我的服务器端代码中有一个http处理程序。 所有回复都通过处理程序。我正在实现代码,检查对客户端的响应是否是2xx响应,否则(即404)路由到我的自定义错误页面。

最终,根据我正在检查请求和响应的某些条件,我会有一个不同的错误页面,但首先我只需要知道如何在我的视图中重新路由到一个简单的error.cshtml页面

如何修改响应,以便将客户端路由到我的Error.cshtml页面(在视图中),而不是使用404回复?

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;
        }
    }
}

2 个答案:

答案 0 :(得分:0)

您可以使用global.asax中的Application_Error处理程序。

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));
    }
}

答案 1 :(得分:0)

我的解决方案是使用HttpContext.Current.Response.RedirectToRoute

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;
        }
    }
}