Asp.net

從通用處理程序 (.ashx) 進行非同步呼叫

  • February 17, 2019

我的網站中有一個表單,它將 json 發佈到非同步處理程序,該處理程序驗證數據並返迴響應 OK 或錯誤,我將根據我的處理程序給出的響應在客戶端上進行重定向。

但是當響應正常時,我想非同步執行一些任務。但是非同步呼叫在 .ashx 程式碼中不起作用。它始終是同步的。

你能給我一個建議嗎?

程式碼:

public class ValidateHandler : IHttpHandler, IRequiresSessionState
   {

       public void ProcessRequest(HttpContext context)
       {
           NameValueCollection nvcForm = context.Request.Form;
           Dictionary<string, string> errorFieldsDict = new Dictionary<string, string>();


           foreach (string nameValueKey in nvcForm.AllKeys)
           {
               regExpToTest = string.Empty;
               switch (nameValueKey)
               {
                   case "firstName":
                     //validate
                       break;
                   case "lastName":
                      //validate
                       break;
                   case "email":
                       //validate
                       break;
                   case "phoneNumber":
                   //validate
                       break;
                   case "phoneCountryCode":
                       //validate
                       break;
                   case "country":
                    //validate
                       break;
                   case "addressLine1":
                       //validate
                       break;
                   case "addressLine2":
                      //validate
                       break;
                   case "city":
                       //validate
                       break;
                   case "postalCode":
                       //validate
                       break;
                   default:
                       //validate
                       break;
               }
               if (!string.IsNullOrEmpty(regExpToTest) && !Regex.IsMatch(nvcForm[nameValueKey], regExpToTest) && !string.IsNullOrEmpty(nvcForm[nameValueKey]))
               {
                   errorFieldsDict.Add(nameValueKey, "Please Enter Correct Value");
                   isSuccess = false;
               }
           }

           //Do your business logic here and finally

           if (isSuccess)
           {
               JavaScriptSerializer serializer = new JavaScriptSerializer();
               try
               {
                   Dictionary<string, object> formValues = GetDictionaryForJson(nvcForm);
                   string previoiusUrl = GetRequestedURL(context);
                   string partner = string.Empty;
                   if (System.Web.HttpContext.Current.Session["yourpartner"] != null)
                       partner = System.Web.HttpContext.Current.Session["yourpartner"].ToString();
                   else if (System.Web.HttpContext.Current.Request.QueryString["utm_source"] != null)
                       partner = System.Web.HttpContext.Current.Request.QueryString["utm_source"];
                   else
                       partner = "company";
                   formValues.Add("partnerCode", partner);
                   string brochureType = string.Empty;
                   if (!string.IsNullOrEmpty(nvcForm["addressLine1"]) || !string.IsNullOrEmpty(nvcForm["addressLine2"]))
                       brochureType = "FBRO";
                   else
                       brochureType = "EBRO";
                   //Create a row in database
                   Item programItem = Sitecore.Context.Database.Items.GetItem(programRootpath + nvcForm["selectYourProgram"]); ;
                   AsyncMailSender caller = new AsyncMailSender(SendEmail);
                   IAsyncResult result = caller.BeginInvoke(programItem, nvcForm["email"], null, null);
               }
               catch (Exception ex)
               {
                   isSuccess = false;
                   Log.Error("Enquiry handler failure: " + ex.Message, ex);
                   response.response = "error";
                   response.message = ex.Message;
                   context.Response.ContentType = "application/json";
                   context.Response.Write(JsonConvert.SerializeObject(response));
               }
               if (isSuccess)
               {
                   response.response = "ok";
                   context.Response.ContentType = "application/json";
                   context.Response.Write(JsonConvert.SerializeObject(response));
               }

           }
           else
           {
               response.response = "errorFields";
               response.errorFields = errorFieldsDict;
               context.Response.ContentType = "application/json";
               string responseJson = JsonConvert.SerializeObject(response);
               context.Response.Write(JsonConvert.SerializeObject(response, Newtonsoft.Json.Formatting.None));
           }

       }
       private string GetRequestedURL(HttpContext context)
       {
           string previousURL = string.Empty;
           try
           {
               previousURL = context.Request.ServerVariables["HTTP_REFERER"];
           }
           catch
           {
               previousURL = context.Request.Url.AbsolutePath;
           }
           return previousURL;
       }
       public bool IsReusable
       {
           get
           {
               return false;
           }
       }
       private void SendEmail(Item programItem, string toEmail)
       {

           if (programItem != null)
           {
              SendEmail()

           }
       }
       private Dictionary<string, object> GetDictionaryForJson(NameValueCollection formValues)
       {
           Dictionary<string, object> formDictionary = new Dictionary<string, object>();
           foreach (string key in formValues.AllKeys)
           {
               formDictionary.Add(key, formValues[key]);
           }

           return formDictionary;
       }

   }
   public delegate void AsyncMailSender(Item program, string toAddress);

PS:我確實隱藏了一些程式碼,這只是我們的業務。但如果您能對此發表評論,那就太好了。

多謝你們

您需要在 web.config 文件中實現IHttpAsyncHandler而不是IHttpHandler註冊它。瀏覽器也會遵守連接限制,因此請確保正確配置 IIS 以處理多個連接、保持活動等。

這是詳細的演練:http: //msdn.microsoft.com/en-us/library/ms227433.aspx

在 ASP.NET 4.5 中是HttpTaskAsyncHandler. 你可以像這樣使用它:

public class MyHandler : HttpTaskAsyncHandler {

   public override async Task ProcessRequestAsync(HttpContext context) {
      await WhateverAsync(context);
   }

}

引用自:https://stackoverflow.com/questions/8299194