Обработка ошибок на уровне приложения в Genexus - PullRequest
0 голосов
/ 03 июня 2019

Я пытаюсь обработать ошибки на уровне приложения в Genexus Ev1 (генератор C #), чтобы при возникновении исключения оно могло быть зарегистрировано.

При поиске в Интернете требование может быть решено с помощью:

https://docs.microsoft.com/en-us/aspnet/web-forms/overview/getting-started/getting-started-with-aspnet-45-web-forms/aspnet-error-handling

Добавление страницы CustomError на уровне web.config работает нормально, но я не могу получить информацию сервера об ошибке на странице. Переменная и ErrorMsg, показанные ниже, всегда возвращают пустое

Event Start

    &ErrorMsg.SetEmpty()
    CSHARP System.Web.HttpServerUtility Server = System.Web.HttpContext.Current.Server;
    CSHARP Exception ex = Server.GetLastError();
    CSHARP     if (ex != null) {
    CSHARP          ex = ex.GetBaseException();
    CSHARP          [!&ErrorMsg!] = ex.ToString();
    CSHARP  }

EndEvent

Код выше (и многие другие варианты) не работает.

Полагаю, все в порядке, поскольку исключение сервера очищается при достижении страницей ошибок выполнения этого кода, поэтому исключение равно нулю, поэтому файл Global.asax должен быть настроен на перехват и передачу исключения

Проблема:

В веб-приложениях GeneXus нет файла global.asax, поэтому добавление его вручную с помощью приведенного ниже кода также не работает

<%@ language="C#" %>
<script runat="server">
void Application_Error(object sender, EventArgs e){

// Code that runs when an unhandled error occurs.

// Get last error from the server
Exception exc = Server.GetLastError();
if (exc is HttpUnhandledException){
    if (exc.InnerException != null){
        exc = new Exception(exc.InnerException.Message);
Server.Transfer("ErrorPageLog.aspx?handler=Application_Error%20-%20Global.asax",
      true);
   }
 }
}

Есть кто-нибудь, кто уже пытался сделать это в GeneXus? Кто-нибудь может уточнить, что я делаю не так?

1 Ответ

0 голосов
/ 06 июня 2019

После нескольких дней исследований мне удалось решить эту проблему.

Вот что я сделал:

  • Создайте текстовый файл и назовите его Global.asax
  • Переместить этот файл в корневую папку приложения
  • Отредактируйте содержимое файла и добавьте этот код

    <%@ Application Language="C#" %>
    <script runat="server">
        void Application_Start(object sender, EventArgs e)
       {
           // Code that runs on application startup
       }
       void Application_End(object sender, EventArgs e)
       {
       //  Code that runs on application shutdown
       }
       void Session_Start(object sender, EventArgs e)
       {
       // Code that runs when a new session is started
       Session["ServerException"] = "";
       }
       void Session_End(object sender, EventArgs e)
       {
       // Code that runs when a session ends.
       // Note: The Session_End event is raised only when the sessionstate mode
       // is set to InProc in the Web.config file. If session mode is set to StateServer
       // or SQLServer, the event is not raised.
       }
    
       protected void Application_Error(Object sender, EventArgs e)
       {
       // Code that runs when an unhandled error occurs.
    
       // Get last error from the server
       Exception exc = Server.GetLastError();
       Session["ServerException"] = exc.InnerException.Message;
    
       Server.ClearError();
       Response.Clear();
       Response.Redirect("ErrorPageLog.aspx");
    
       }
       </script>
    
  • Создайте новую веб-панель в GeneXus KB и назовите ее ErrorPageLog

  • Редактировать событие Начать, добавить этот код и собрать его

    Event Start
        &ErrorMsg.SetEmpty()
    
        CSHARP [!&ErrorMsg!] = System.Web.HttpContext.Current.Session["ServerException"].ToString();
    EndEvent    
    

Это должно перенести веб-сеанс с ошибкой приложения на страницу, затем вы можете делать с сообщением все, что захотите, а также иметь возможность управлять им с помощью кода GeneXus.

ПРИМЕЧАНИЕ : в этом примере я отправляю простейшую информацию об исключении, более подробную информацию о нем можно получить.

...