Asynchronous calls form a common handler (.ashx)

I have a form on my website that sends json to the async handler, which validates the data and returns an OK response or an error, and I will do a redirect to the client based on the response provided by my handler.

But when the answer is ok, I want to perform some tasks asynchronously. But asynchronous calls do not work inside .ashx code. it is always synchronous.

Could you give me some advice on this?

the code:

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: I really hid some kind of code, which is only our business. But it would be great if you could comment on this.

thanks guys

+8
asynchronous delegates ashx
source share
2 answers

You need to enter IHttpAsyncHandler instead of IHttpHandler and register it as such in the web.config file. Browsers will also abide by connection restrictions, so make sure IIS is configured correctly to handle multiple connections, keep it active, etc.

Browse here in detail: http://msdn.microsoft.com/en-us/library/ms227433.aspx

+6
source share

ASP.NET 4.5 has an HttpTaskAsyncHandler . You can use it as follows:

 public class MyHandler : HttpTaskAsyncHandler { public override async Task ProcessRequestAsync(HttpContext context) { await WhateverAsync(context); } } 
+17
source share

All Articles