Asp.net
從通用處理程序 (.ashx) 進行非同步呼叫
我的網站中有一個表單,它將 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); } }