簡體   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