如何处理HTTPHandler中的异常?

时间:2013-09-12 14:35:48

标签: c# asp.net html5 http

我使用HTML和asp.net HTTP Handler邮件发送程序。

这是我的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. 如果出现任何异常,如何处理异常或异常消息?

2 个答案:

答案 0 :(得分:1)

您可以使用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.");
}

答案 1 :(得分:0)

我知道这是一个相当古老的问题,但它仍然没有得到公认的答案,更不用说我认为最合适的答案。 OP声明的表单的目的是简单地根据HTML表单的输入发送电子邮件,并根据需要提供成功/失败消息。对于ASP.NET HTTP处理程序,这不是一个合适的情况。我知道,没有任何好处,HTTP处理程序将简单地POST回到Web表单。但是,使用Web表单中的回发处理程序可以轻松执行以下操作:

  1. 重定向成功
  2. 成功时显示消息
  3. 出现错误时显示带有详细信息的消息
  4. 重定向,没有详细信息,出错
  5. 例如,您可能有一个通常不可见的ASP.NET Panel控件,但是当您在验证表单或发送电子邮件时遇到错误时,您可以在那里显示错误消息。如果您尝试使用HTTP处理程序执行此操作,则必须执行过多繁重操作,将错误消息注入相同或另一个页面,或者您有一个非常乏味的纯文本消息要发送到客户端。

    如果您必须使用HTTP处理程序,我建议使用Karl Anderson的answer并添加至少 {{ 1}}到一个对错误有意义的HTTP状态代码。答案如下,如果context.Response.StatusCode方法抛出异常,HTTP处理程序会将错误消息作为HTTP 200(OK)发送回客户端,如果有异常并且电子邮件不能,则该错误消息不正确被发送。我没有测试过这种方法(使用SendEmail()),但我相信你最终会将非常基本的文本输出结果作为对提交表单所产生的POST请求的响应。不会有任何HTML,具体取决于应用程序配置为处理HTTP错误的方式。如果您有HTTP 500的自定义错误处理程序,并且您配置了context.Response.Write()块以将catch设置为500,那么您必须配置该自定义处理程序页面以按顺序读取响应消息将该消息注入您的自定义处理程序页面内容。