عدم الحصول على إعادة توجيه إلى صفحة الخطأ المخصصة باستخدام أخطاء مخصصة - ASP.NET
-
22-09-2019 - |
سؤال
إليك Application_Onerror Event Sink في Global.asax.vb:
Sub Application_OnError(ByVal sender As Object, ByVal e As EventArgs)
Dim innerMostException As Exception = getInnerMostException(Me.Context.Error)
If TypeOf innerMostException Is AccessDeniedException Then
Security.LogAccessDeniedOccurrence(DirectCast(innerMostException, AccessDeniedException))
Dim fourOhThree As Integer = DirectCast(HttpStatusCode.Forbidden, Integer)
Throw New HttpException(fourOhThree, innerMostException.Message, innerMostException)
End If
End Sub
سترى أنه إذا حصلنا على استثناء الأعمق من Type AccessDeniEdException ، فإننا نرمي httpexcpetion جديد مع رمز الحالة 403 الملقب "المحظور"
إليك إدخال Web.Config ذات الصلة:
<customErrors defaultRedirect="~/Application/ServerError.aspx" mode="On">
<error statusCode="403" redirect="~/Secure/AccessDenied.aspx" />
</customErrors>
إذن ما نتوقعه هو إعادة توجيه إلى صفحة AccessDenied.aspx. ما كنا احصل على هو إعادة توجيه إلى صفحة servererror.aspx.
لقد جربنا هذا أيضًا:
Sub Application_OnError(ByVal sender As Object, ByVal e As EventArgs)
Dim innerMostException As Exception = getInnerMostException(Me.Context.Error)
If TypeOf innerMostException Is AccessDeniedException Then
Security.LogAccessDeniedOccurrence(DirectCast(innerMostException, AccessDeniedException))
Context.Response.StatusCode = DirectCast(HttpStatusCode.Forbidden, Integer)
End If
End Sub
وهو ما لا ينجح بشكل غير مستورق أيضًا.
أي أفكار ما نفعله خطأ؟
المحلول
Application_Error
يهدف إلى التقاط أخطاء لا يتم التعامل معها بواسطة تطبيقك. عندما يطلق النار ، حدث خطأ بالفعل وكل شيء يدور حول هذا الخطأ. إذا رميت خطأ من الداخل Application_Error
أنت تقول بالفعل "هناك خطأ في معالج الأخطاء". بدلا من ذلك فقط Server.Transfer
إلى الصفحة المناسبة. إذا كنت ترغب في الاحتفاظ بجميع منطق إعادة توجيهك في الويب. هذه المقالة حول كيفية تحليل قسم Customerrors لمعرفة مكان إعادة التوجيه إلى.
قيل كل هذا ، ولم أحاول هذا ، لكن هل يمكنك محاولة الاتصال Server.ClearError()
:
Dim Ex = Server.GetLastError()
Server.ClearError()
Throw New HttpException(System.Net.HttpStatusCode.Forbidden, Nothing, Ex)
لا أعتقد أنه سيعمل بسبب ما قلته أعلاه ولكنه يستحق المحاولة.