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
sbmandav
source share