7

HTTP エラー 404.0 - 見つかりませんでした。をオンにしました

<customErrors mode="On" defaultRedirect="~/Error/General">
      <error statusCode="404" redirect="~/Error/HttpError404" />
      <error statusCode="500" redirect="~/Error/HttpError500" />
    </customErrors>

Web.Config で。しかし、問題はまだ存在します。私もこの解決策を試しました(ただし、メソッドには到達しません):

protected void Application_Error()
    {
      var exception = Server.GetLastError();
      var httpException = exception as HttpException;
      Response.Clear();
      Server.ClearError();
      var routeData = new RouteData();
      routeData.Values["controller"] = "Errors";
      routeData.Values["action"] = "General";
      routeData.Values["exception"] = exception;
      Response.StatusCode = 500;
      if (httpException != null)
      {
        Response.StatusCode = httpException.GetHttpCode();
        switch (Response.StatusCode)
        {
          case 403:
            routeData.Values["action"] = "HttpError404";
            break;
          case 404:
            routeData.Values["action"] = "HttpError404";
            break;
        }
      }

      IController errorsController = new ErrorController();
      var rc = new RequestContext(new HttpContextWrapper(Context), routeData);
      errorsController.Execute(rc);
    }

@Darin Dimitrov提供

これはコントローラーです:

public class ErrorController : Controller
  {

    public ActionResult HttpError404(string error)
    {
      ViewData["Title"] = "Sorry, an error occurred while processing your request. (404)";
      ViewData["Description"] = error;
      return View("Index");
    }

    public ActionResult HttpError500(string error)
    {
      ViewData["Title"] = "Sorry, an error occurred while processing your request. (500)";
      ViewData["Description"] = error;
      return View("Index");
    }


    public ActionResult General(string error)
    {
      ViewData["Title"] = "Sorry, an error occurred while processing your request.";
      ViewData["Description"] = error;
      return this.View();

    }
4

2 に答える 2

12

@alistair-findlay とこのウェブサイトのおかげで解決策が見つかりました。web.config は次のようになります。

<system.web>
    <customErrors mode="On" defaultRedirect="~/Error/General" redirectMode="ResponseRewrite"> 
        </customErrors>
 </system.web>
  <system.webServer>
<httpErrors errorMode="Detailed" defaultResponseMode="Redirect">
      <clear/>
      <error statusCode="404" path="/Error/HttpError404"/>
    </httpErrors>

  </system.webServer

これは Global.asax.cs です。

  protected void Application_Error()
    {

      if (Context.IsCustomErrorEnabled)
        ShowCustomErrorPage(Server.GetLastError());

    }
    private void ShowCustomErrorPage(Exception exception)
    {
      var httpException = exception as HttpException ?? new HttpException(500, "Internal Server Error", exception);

      Response.Clear();
      var routeData = new RouteData();
      routeData.Values.Add("controller", "Error");
      routeData.Values.Add("fromAppErrorEvent", true);

      switch (httpException.GetHttpCode())
      {
        case 403:
          routeData.Values.Add("action", "HttpError403");
          break;

        case 404:
          routeData.Values.Add("action", "HttpError404");
          break;

        case 500:
          routeData.Values.Add("action", "HttpError500");
          break;

        default:
          routeData.Values.Add("action", "GeneralError");
          routeData.Values.Add("httpStatusCode", httpException.GetHttpCode());
          break;
      }

      Server.ClearError();

      IController controller = new ErrorController();
      controller.Execute(new RequestContext(new HttpContextWrapper(Context), routeData));
    }

そして最後に:

 public class ErrorController : Controller
  {

    public ActionResult HttpError403(string error)
    {
      ViewBag.Description = error;
      return this.View();
    }
于 2013-03-05T08:09:35.717 に答える
2

ErrorControllercustomErrors 属性でリダイレクトを処理するを実装しましたか? あなたの場合、次のようになります。

public class ErrorController : Controller
{
    public ActionResult General()
    {
        return View();
    }

    public ActionResult HttpError404()
    {
        return View();
    }

    public ActionResult HttpError500()
    {
        return View();
    }
}

また、Views フォルダー内の ActionResults ごとにビューを実装する必要があります。

Application_Errorエラーのログ記録に関しては、次のようにイベント ハンドラーでこれを実装する必要があります。

protected void Application_Error()
{
    var exception = Server.GetLastError();
    var httpException = exception as HttpException;
    // Do logging here
}

これは、上記で定義したエラー ページに 302 リダイレクトする前にエラーを「キャッチ」するためErrorControllerです。

于 2013-03-04T15:03:43.920 に答える