捕获Elmah生成的电子邮件正文应用程序错误信息

时间:2016-02-11 20:08:56

标签: asp.net vb.net elmah

我公司网站中的电子邮件服务器不允许从网络应用程序发送电子邮件。

当我的应用程序发送电子邮件时,我是通过在SQL服务器上运行的存储过程来完成的。因此,我无法使用Elmah的电子邮件生成功能来通知网站管理员我的Web应用程序中发生的错误。

我创建了一个ErrorMessage_Elmah.aspx页面,它会通知应用程序用户发生了错误。

在该aspx页面的Page_Load事件中,我执行电子邮件存储过程,向其传递收件人,主题和正文信息。

据我了解,Elmah捕获的与错误有关的信息包含在Elmah.axd文件中。我想捕获这些信息并将其放入我的电子邮件正文中。如何以编程方式访问Elmah.axd以获取插入电子邮件正文的错误信息?

1 个答案:

答案 0 :(得分:0)

我还想从我的网络应用程序发送电子邮件,似乎没有elmah中的配置允许SQL存储过程发送(也不能使用smtp)。我很了解如何通过给定的存储过程对elmah表进行日志记录。

这让我想到答案是改变elmah安装附带的存储过程并在那里提供我自己的电子邮件例程。我已经测试了以下XML将如何出现在HTML电子邮件中。它是冠军!

ALTER PROCEDURE [dbo].[ELMAH_LogError]
(
    @ErrorId UNIQUEIDENTIFIER,
    @Application NVARCHAR(60),
    @Host NVARCHAR(30),
    @Type NVARCHAR(100),
    @Source NVARCHAR(60),
    @Message NVARCHAR(500),
    @User NVARCHAR(50),
    @AllXml NTEXT,
    @StatusCode INT,
    @TimeUtc DATETIME
)
AS

    SET NOCOUNT ON

    INSERT
    INTO
        [ELMAH_Error]
        (
            [ErrorId],
            [Application],
            [Host],
            [Type],
            [Source],
            [Message],
            [User],
            [AllXml],
            [StatusCode],
            [TimeUtc]
        )
    VALUES
        (
            @ErrorId,
            @Application,
            @Host,
            @Type,
            @Source,
            @Message,
            @User,
            @AllXml,
            @StatusCode,
            @TimeUtc
        );
    DECLARE @TmpSubject VARCHAR(80);
    SET @TmpSubject = 'ELMAH ERROR LOG ('+@Application+')';

    -- here is the good stuff:
    DECLARE @TmpDetail NVARCHAR(MAX);
    DECLARE @TmpMessage NVARCHAR(MAX);
    DECLARE @xml as xml;

    set @xml = (SELECT @AllXML);

    select @TmpDetail = (select x.i.value('@webHostHtmlMessage', 'nvarchar(max)') --as HTML
    from @xml.nodes('/error') as x(i));

    SELECT @TmpMessage = '<p style="color:#000; font-size:12pt; font face:arial">USER '+@User+' encountered the following error at UTC: '+cast(@TimeUtc as varchar(22))+'</p>'+char(10)+@TmpDetail;

    -- now we can send the HTML in the body of an HTML formatted SMTP email routine:
    exec dbo.spSendHTML @To='support@mycompany.com', @SUBJECT=@TmpSubject, @MESSAGE=@TmpMessage;