ASP.NET HttpException.GetHttpCode () возвращает 0 - PullRequest
0 голосов
/ 07 июля 2011

Короткая версия:

Если я создаю System.Web.HttpException следующим образом:

var exception = new HttpException(403, "Forbidden");

Я ожидал бы, что следующие методы вернут эти значения, но они этого не делают:

var code = exception.GetHttpCode(); // is 0
var msg = exception.GetHtmlErrorMessage(); // is: null

Редактировать: Фактически GetHttpCode() возвращает правильный номер при вызове в первый раз, но возвращает 0 при вызове во второй раз:

var code = exception.GetHttpCode(); // is 403
code = exception.GetHttpCode(); // is 0

Длинная версия:

Я пытаюсь выполнить модульное тестирование метода обработки глобальных исключений ASP.NET "Application_Error". Это выдержка из кода:

var httpException = server.GetLastError() as HttpException;
if (httpException != null)
{
    response.StatusCode = httpException.GetHttpCode();
    response.StatusDescription = httpException.GetHtmlErrorMessage();

// ...

В модульном тесте этот метод вызывается с фиктивным ServerUtilityBase объектом (Moq), который возвращает HttpException при вызове server.GetLastError():

var exception = new HttpException(403, "Forbidden");
serverMock.Setup(server => server.GetLastError()).Returns(exception);
// ...

К сожалению, мне пришлось выяснить, что в коде обработки ошибок методы httpException.GetHttpCode() и httpException.GetHtmlErrorMessage() возвращают 0 или null соответственно.

Что нужно сделать, чтобы new HttpException(403, "Forbidden") return 403 или "Forbidden" при вызове этих методов?

К сожалению, невозможно создать Mock исключения, сделав его подклассом, потому что указанные методы запечатаны.

1 Ответ

2 голосов
/ 17 февраля 2012

Метод httpException.GetHtmlErrorMessage () используется для возврата html-кода, отправляемого в браузер средой выполнения ASP.NET, Патрик прав в том, что вам нужно взглянуть на свойство .Message, чтобы увидеть текст «запрещено».,Если вы хотите увидеть, как выглядит настоящий html, вам нужно указать внутреннее исключение, которое является типом исключения, которое может использовать ErrorFormatter (например, SecurityException).

var httpException = new HttpException(403, "Forbidden", new SecurityException());

Console.WriteLine(httpException.GetHttpCode());
Console.WriteLine(httpException.Message);
Console.WriteLine(httpException.GetHtmlErrorMessage());

выведет:

<code>403
Forbidden
<html>
    <head>
        <title>Security Exception</title>
        <style>
         body {font-family:"Verdana";font-weight:normal;font-size: .7em;color:bl
ack;}
         p {font-family:"Verdana";font-weight:normal;color:black;margin-top: -5p
x}
         b {font-family:"Verdana";font-weight:bold;color:black;margin-top: -5px}

         H1 { font-family:"Verdana";font-weight:normal;font-size:18pt;color:red
}
         H2 { font-family:"Verdana";font-weight:normal;font-size:14pt;color:maro
on }
         pre {font-family:"Lucida Console";font-size: .9em}
         .marker {font-weight: bold; color: black;text-decoration: none;}
         .version {color: gray;}
         .error {margin-bottom: 10px;}
         .expandable { text-decoration:underline; font-weight:bold; color:navy;
cursor:hand; }
        </style>
    </head>

    <body bgcolor="white">

            <span><H1>Server Error in '' Application.<hr width=100% size=1 color
=silver></H1>

            <h2> <i>Security Exception</i> </h2></span>

            <font face="Arial, Helvetica, Geneva, SunSans-Regular, sans-serif ">


            <b> Description: </b>The application attempted to perform an operati
on not allowed by the security policy. &nbsp;To grant this application the requi
red permission please contact your system administrator or change the applicatio
n's trust level in the configuration file.
            <br><br>

            <b> Exception Details: </b>System.Security.SecurityException: Securi
ty error.<br><br>

            <b>Source Error:</b> <br><br>

            <table width=100% bgcolor="#ffffcc">
               <tr>
                  <td>
                      <code>

An unhandled exception was generated during the execution of the current web req
uest. Information regarding the origin and location of the exception can be iden
tified using the exception stack trace below.</code>

                  </td>
               </tr>
            </table>

            <br>

            <b>Stack Trace:</b> <br><br>

            <table width=100% bgcolor="#ffffcc">
               <tr>
                  <td>
                      <code><pre>

[SecurityException: Security error.]

...