从通用处理程序(.ashx)进行异步调用

从通用处理程序(.ashx)进行异步调用

问题描述:

我的网站上有一个表单,该表单将json发送到异步处理程序,该程序将验证数据并返回共振OK或错误,然后我将根据处理程序给出的响应在客户端上进行重定向。

I have a form in my website which posts json to the async handler which validates the data and return back the resonse OK or error and i will make the redirect on the client based on the response give by my handler.

但是当响应正常时,我想异步执行一些任务。但是异步调用在.ashx代码内部不起作用。

But when the response is ok, i want to perform some tasks asynchronously. But the asynchronous calls are not working inside the .ashx code. it is always synchronous.

请问我一个建议。

代码:

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:我确实隐藏了一些代码,这只是我们的业务。

PS: I did hide some code which is just our business.But Would be great if you can comment on that.

感谢伙计们

您需要实施 IHttpAsyncHandler 而不是 IHttpHandler 并将其注册在web.config文件中。浏览器还会观察到连接限制,因此请确保正确配置IIS以处理多个连接,保持活动状态等。

You need to implmement IHttpAsyncHandler rather than IHttpHandler and register it as such in the web.config file. Browsers will also observe connection limits, so make sure IIS is configured properly to handle multiple connections, keep-alive, etc.

这里有详细的演练: http://msdn.microsoft.com/en-us/library/ms227433.aspx