繁体   English   中英

如何处理HTTPHandler中的异常?

[英]How to handle exceptions in HTTPHandler?

我有使用HTML和asp.net HTTP处理程序的邮件发送程序。

这是我的html页面,它将请求发送到.ashx页面

<html>
<form id="ContactForm" action="EmailHandler.ashx" method="post">
    Name: <input class="input" type="text" id="contactname" name="contactname" autocomplete="on" required/>
    Email <input class="input" type="email" id="contactemail" name="contactemail" autocomplete="on" required />
    Comments<textarea cols="50" rows="5" id="contactmessage" name="contactmessage" required></textarea>

    <input type="submit" id="emailsubmit" name="emailsubmit" value="Send" />
</form>
</html>

这是我的httphandler(EmailHandler.ashx)

public class EmailHandler : IHttpHandler {

    public void ProcessRequest (HttpContext context) {
        context.Response.ContentType = "text/plain";
        //context.Response.Write("Hello World");
        string name = context.Request.Form["contactname"];
        string email = context.Request.Form["contactemail"];
        string content = context.Request.Form["contactmessage"];
        try
        {
            SendEmail(name, email, content);

        }
        catch (Exception)
        {
           *******
        }
    }

    public bool IsReusable { get { return false; } }

    public void SendEmail(string name, string emailid, string emailcontent)
    {
        SmtpClient serverobj = new SmtpClient();
        MailMessage msgobj = new MailMessage();

        msgobj.To.Add("abc@ymail.com");
        msgobj.Subject = "Its From Guest";
        msgobj.Body = emailcontent;
        msgobj.IsBodyHtml = true;
        msgobj.DeliveryNotificationOptions = DeliveryNotificationOptions.OnFailure;
        serverobj.Send(msgobj);

    }

现在如何处理该处理程序的响应。

  1. 如果电子邮件发送成功,如何将成功消息反映到同一HTML页面?

  2. 如果出现任何异常,该如何处理该异常或异常消息?

您可以使用context将值直接写回到调用页面,如下所示:

public void ProcessRequest (HttpContext context) {
    context.Response.ContentType = "text/plain";
    //context.Response.Write("Hello World");
    string name = context.Request.Form["contactname"];
    string email = context.Request.Form["contactemail"];
    string content = context.Request.Form["contactmessage"];
    try
    {
        SendEmail(name, email, content);
    }
    catch (Exception ex)
    {
       // Write exception message to user
       // You can include some of the exception detail via the ex object, 
       // but be careful how much information you divulge to the user 
       context.Response.Write("There was a problem sending the email.");
    }

    // Email was sent successfully
    context.Response.Write("Email sent successfully.");
}

我知道这是一个很老的问题,但是它仍然没有一个公认的答案,更不用说我认为最适合这种情况的答案了。 OP声明的表单的目的是仅基于来自HTML表单的输入来发送电子邮件,并适当地提供成功/失败消息。 对于ASP.NET HTTP处理程序,这是不合适的情况。 我知道,HTTP处理程序不会给您带来任何好处,只需通过POST回Web表单即可。 但是,在Web表单中使用回发​​处理程序将使您轻松执行以下操作:

  1. 成功重定向
  2. 成功显示消息
  3. 出现错误时显示一条消息,包括详细信息
  4. 发生错误时重定向,没有详细信息

例如,您可能具有通常不可见的ASP.NET Panel控件,但是当您在验证表单或发送电子邮件时遇到错误时,可以在此处显示错误消息。 如果您尝试使用HTTP处理程序来执行此操作,则您要么要做太多繁重的工作,要么将错误消息注入到同一页面或另一页中,要么将非常纯净的纯文本消息发送给客户端。

如果您必须使用HTTP处理程序,我建议您使用Karl Anderson的答案并至少在需要理解该错误的HTTP状态代码中设置context.Response.StatusCode 答案是正确的,如果SendEmail()方法引发异常,则HTTP处理程序会将错误消息以HTTP 200(OK)的形式发送回客户端,如果存在异常并且无法发送电子邮件,则该消息是不正确的。 我尚未测试此方法(使用context.Response.Write() ),但我确实相信您最终会将非常基本的文本输出到浏览器,作为对提交表单后POST请求的响应。 不会有任何HTML,具体取决于您的应用程序配置为处理HTTP错误的方式。 如果您具有用于HTTP 500的自定义错误处理程序,并且已将catch块配置为将StatusCode设置为500,则必须配置该自定义处理程序页面以读取响应消息,以便将该消息注入到您的自定义处理程序页面内容中。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM