2017-01-20 13 views
0

状況:リモートアクセスでカスタムエラーページを表示するにはどうすればよいですか?

エラーをユーザーに表示するには、カスタムエラーページを使用します。

Global.asaxファイルではApplication_Errorフックを使用して、すべてのエラーをカスタムエラーページErrorControllerに転送します。これは~/Error/Indexです。

protected void Application_Error(Object sender, EventArgs e) 
{ 
    var lRedirectController = "Error"; 
    var lRedirectAction = "Index"; 

    [...] 

    var lStatusCode = ?; // will be set dependent on the exception. E.g. 403 

    HttpContextWrapper lContextWrapper = new HttpContextWrapper(Context); 
    RouteData routeData = new RouteData(); 
    routeData.Values.Add("controller", lRedirectController); 
    routeData.Values.Add("action", lRedirectAction); 
    routeData.Values.Add("pStatusCode", lStatusCode); 
    routeData.Values.Add("pIsAjaxRequest", lContextWrapper.Request.IsAjaxRequest()); 

    [...] 

    // execute error controller 
    using (ErrorController lController = new ErrorController()) 
    { 
     RequestContext requestContext = new RequestContext(lContextWrapper, routeData); 
     lController.BaseExecute(requestContext); 
    } 

    Response.End(); 
} 

ErrorControllerIndexアクションに次のコードがあります:

public ActionResult Index(bool pIsAjaxRequest = false, string pMessage = null, int pStatusCode = 500, Exception pException = null, string pAdditionalInfo = null) 
{ 
    // assign the status code to the response header 
    Response.StatusCode = pStatusCode; 

    // [...] 

    // if it was an ajax request, return json, else the view 
    if (!pIsAjaxRequest) 
    { 
     // [...] 

     return View("Index", "_BlankPage"); 
    } 
    else 
    { 
     // json response 
    } 
} 

ルートフォルダ内のファイルweb.config<customErrors mode="On"/>のためノー宣言持ちをGlobal.asaxは、次のコードを持っています。私がそれを加えるかどうか、その振る舞いは同じです。

問題:私は私のローカルマシン上のエラーを実行すると、予想通り

、カスタムエラーページが表示されます。しかし、私は、私は、他のエラーページを取得し、ネットワーク経由でブラウザを介して他のマシンからアプリケーションを呼び出すとき:

enter image description here

質問:

私はリモートでのカスタムエラーページを表示することができますどのようにアクセス?

+0

[こちら](https://www.asp.net/web-forms/overview/older-versions-getting-started/deploying-web-site-projects/displaying-a-custom-error-page)でお読みください。 -cs) – crowchirp

+0

@crai:あなたが私の質問に「私はそれを付け加えてもしなくても、行動は同じです。さらに、あなたのリンクの背後にあるページはYSODについて話しています。私の質問でスクリーンショットを見ることができるように、それはYSODではありません。 – Simon

+0

オクラホマ、それを持って、答えを見てください – crowchirp

答えて

0

あなたのエラーページ

Error.cshtml ErrorModel

public class ErrorModel 
    { 

     public int ErrorCode { get; set; } 
     public bool IsHttpException { get; set; } 
     public string ViewFile { get; set; } 
     public string ErrorUrl { get; set; } 
    } 

のGlobal.asaxから

プット値

protected void Application_Error() 
     { 

      Exception currentEx = Server.GetLastError(); 
      ErrorModel errorDetail = null; 
      try 
      { 
       errorDetail = ConstructError(Context, currentEx);     
       Context.Items["ErrorObject"] = errorDetail;     
       Server.ClearError(); 
       Context.Response.Clear(); 
       ReportError(); 

      } 
      finally 
      { 
       Cleanup(Context, errorDetail); 
      } 
     } 

     private static void Cleanup(System.Web.HttpContext context, ErrorModel errorInfo) 
     { 

      if (errorInfo != null && !errorInfo.IsAjax && errorInfo.ErrorCode == 500) 
      { 
       if (context.Session != null) 
       { 
        context.Session.Abandon(); 
       } 
      } 
     } 

     private static ErrorModel ConstructError(System.Web.HttpContext context, Exception currentEx) 
     { 
      var model = new ErrorModel();    

      model.IsHttpException = currentEx is HttpException; 
      model.ErrorCode = model.IsHttpException ? ((HttpException)currentEx).GetHttpCode() : 500; 

      model.ViewFile = "~/Views/Error.cshtml"; 
      model.ErrorUrl = context.Request.Url.PathAndQuery; 

      return model; 
     } 

     private void ReportError() 
     { 
      Context.Response.ContentType = "text/html"; 
      var httpWrapper = new HttpContextWrapper(Context); 

      var routeData = new RouteData(); 
      routeData.Values.Add("controller", "error"); 
      routeData.Values.Add("action", "index"); 

      var requestCtx = new RequestContext(httpWrapper, routeData);    

       var controller = ControllerBuilder.Current.GetControllerFactory().CreateController(requestCtx, "Error"); 
       controller.Execute(requestCtx); 


     } 

のErrorController

public ActionResult Index() 
{ 
    // Retrieve error object from either HttpContext or Session 
    ErrorModel err = this.HttpContext.Items["ErrorObject"] as ErrorModel ?? Session["ErrorObject"] as ErrorModel;   

    this.Response.ClearHeaders();    
     Response.ContentType = "text/html"; 
     Response.Write(RenderToString(err.ViewFile, err)); 

} 

    private string RenderToString(string controlName, object viewData) 
{ 
    using (var sw = new StringWriter()) 
    { 
     var viewResult = ViewEngines.Engines.FindPartialView(ControllerContext, controlName); 
     var viewContext = new ViewContext(ControllerContext, viewResult.View, new ViewDataDictionary(viewData), TempData, sw); 
     viewResult.View.Render(viewContext, sw); 

     return sw.GetStringBuilder().ToString(); 
    } 
} 
関連する問題