elmah с customErrors не отправляет по электронной почте, если это не 404 - PullRequest
1 голос
/ 16 сентября 2011

Я играю с Элмой, чтобы узнать, хочу ли я использовать это в качестве решения для обработки ошибок.Я установил его, жестко запрограммировал исключение на своей странице, попал на страницу wholla!Получил мою электронную почту, все счастливы.Однако, когда я добавил узел customError в свой файл web.config для перенаправления на страницу дружественных ошибок, электронное письмо не было отправлено, но я был перенаправлен на страницу дружественных ошибок.

Странно, когда я переходил на страницукоторый не существует на моем сайте, я был перенаправлен на дом (как я установил в моих customErrors), но я ДЕЙСТВИТЕЛЬНО получил электронное письмо ... это может быть проблематично, так как я не хочу получать миллиард электронных писем, когда люди бьют менясайт и добавьте "what.php" в конец URL.

Итак, у меня два вопроса: 1) почему выбрасываемое исключение НЕ отправляет мне электронное письмо и 2) как я могу сказать ЭлмеНЕ присылать мне письма на 404?

1 Ответ

4 голосов
/ 16 сентября 2011

Вы можете фильтровать вещи с помощью elmah, например, в вашем Global.asax.cs:

    //ELMAH Filtering
    protected void ErrorLog_Filtering(object sender, ExceptionFilterEventArgs e)
    {
        FilterError404(e);
    }

    protected void ErrorMail_Filtering(object sender, ExceptionFilterEventArgs e)
    {
        FilterError404(e);
    }

    //Dimiss 404 errors for ELMAH
    private void FilterError404(ExceptionFilterEventArgs e)
    {
        if (e.Exception.GetBaseException() is HttpException)
        {
            HttpException ex = (HttpException)e.Exception.GetBaseException();

            if (ex.GetHttpCode() == 404)
            {
                e.Dismiss();
            }
        }
    }

Так что добавьте вызов FilterError404 к любой части фильтрации. В приведенном выше примере фильтр 404 будет использоваться как для ErrorLog, так и для Email. Также проверьте: http://code.google.com/p/elmah/wiki/ErrorFiltering

Вы также можете выполнить фильтрацию по источнику, как описано в ссылке:

<elmah>
    ...
    <errorFilter>
        <test>
            <and>
                <equal binding="HttpStatusCode" value="404" type="Int32" />
                <regex binding="FilterSourceType.Name" pattern="mail" />
            </and>
        </test>
    </errorFilter>
</elmah>

Проверьте web.config:

<?xml version="1.0" encoding="UTF-8"?>
<!-- 
    Note: As an alternative to hand editing this file you can use the 
    web admin tool to configure settings for your application. Use
    the Website->Asp.Net Configuration option in Visual Studio.
    A full list of settings and comments can be found in 
    machine.config.comments usually located in 
    \Windows\Microsoft.Net\Framework\v2.x\Config 
-->
<configuration>
  <configSections>
    <sectionGroup name="elmah">
      <section name="security" requirePermission="false" type="Elmah.SecuritySectionHandler, Elmah" />
      <section name="errorLog" requirePermission="false" type="Elmah.ErrorLogSectionHandler, Elmah" />
      <section name="errorMail" requirePermission="false" type="Elmah.ErrorMailSectionHandler, Elmah" />
      <section name="errorFilter" requirePermission="false" type="Elmah.ErrorFilterSectionHandler, Elmah" />
    </sectionGroup>   
  </configSections>
  <appSettings />
  <!-- ELMAH: Configuration -->
  <elmah>
    <security allowRemoteAccess="1" />
    <errorLog type="Elmah.SqlErrorLog, Elmah" connectionStringName="Elmah.Sql" />
    <errorMail defaultCredentials="true" from="someuser@example.com" to="someuser@example.com, someuser2@example.com" subject="Error (STAGING): {0}" async="true" smtpPort="25" smtpServer="192.168.1.1" userName="smtpUserName" password="smtpPassword" />
  </elmah>
  <connectionStrings>  
    <add name="Elmah.Sql" connectionString="Data Source=192.168.1.1;database=DBName;integrated security=false;User ID=MyUserName;Password=MyPassword" />
  </connectionStrings>
  <system.net>
    <mailSettings>
      <smtp deliveryMethod="Network" from="someuser@example.com">
        <network defaultCredentials="true" host="192.168.1.1" port="25" userName="smtpUserName" password="smtpPassword" />
      </smtp>
      <!-- Use this setting for development
      <smtp deliveryMethod="SpecifiedPickupDirectory">
        <specifiedPickupDirectory pickupDirectoryLocation="C:\Temp" />
      </smtp>
      -->
    </mailSettings>
  </system.net>
  <system.web>
    <!-- 
            Set compilation debug="true" to insert debugging 
            symbols into the compiled page. Because this 
            affects performance, set this value to true only 
            during development.
    -->
    <compilation debug="true">
      <assemblies>
        ...........................
      </assemblies>
    </compilation>

        .......................
    <!--
            The <customErrors> section enables configuration 
            of what to do if/when an unhandled error occurs 
            during the execution of a request. Specifically, 
            it enables developers to configure html error pages 
            to be displayed in place of a error stack trace.
      -->
    <customErrors mode="RemoteOnly" defaultRedirect="~/Home/MyErrorPage" />
  .............................
    <httpHandlers>
        ..............................
      <!--ELMAH-->
      <add verb="POST,GET,HEAD" path="/MyErrorPage/elmah.axd" type="Elmah.ErrorLogPageFactory, Elmah" />
    </httpHandlers>
    <httpModules>
  ........................
      <!-- ELMAH: Logging module -->
      <add name="ErrorLog" type="Elmah.ErrorLogModule, Elmah" />
      <add name="ErrorMail" type="Elmah.ErrorMailModule, Elmah" />
    </httpModules>
  </system.web>

  <system.webServer>
    <validation validateIntegratedModeConfiguration="false" />
    <modules runAllManagedModulesForAllRequests="true">
    .............................
    <!-- ELMAH-->
      <add name="ErrorLog" type="Elmah.ErrorLogModule, Elmah" />
      <add name="ErrorMail" type="Elmah.ErrorMailModule, Elmah" />
      <add name="ErrorFilter" type="Elmah.ErrorFilterModule, Elmah" />
    </modules>
    <handlers>
    ..............
      <!--ELMAH-->
      <add name="Elmah" verb="POST,GET,HEAD" path="/MyErrorPage/elmah.axd" type="Elmah.ErrorLogPageFactory, Elmah" />
    </handlers>
  </system.webServer>
 ..................
</configuration>

К вашему сведению: Пакет NuGET также доступен, как объяснил Скотт Хансельман: http://www.hanselman.com/blog/NuGetPackageOfTheWeek7ELMAHErrorLoggingModulesAndHandlersWithSQLServerCompact.aspx

...