Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

making asynchronous calls from generic handler (.ashx)

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.

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.

Could you please give me an advice on this.?

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 did hide some code which is just our business.But Would be great if you can comment on that.

thanks guys

like image 619
sbmandav Avatar asked Nov 28 '11 16:11

sbmandav


People also ask

How do I call a generic handler in C#?

For calling the generic handler we need to create a function for calling the generic handler. Now we need to call the jQuery method on button click: <asp:Button ID="AS" runat="server" Text="Submit" CssClass="mainBtn" OnClientClick="CallHandler();" />

How does ASHX work?

An ASHX file is a webpage that is used by the ASP.NET HTTP Handler to serve user with the pages that are referenced inside this file. The ASP.NET HTTP Handler processes the incoming request, references the pages from the . ashx file, and sends back the compiled page back to the user's browser.

Is ASP NET asynchronous?

The . NET Framework 4 introduced an asynchronous programming concept referred to as a Task and ASP.NET 4.5 supports Task. Tasks are represented by the Task type and related types in the System.

Where we can define the generic handler?

ASHX Generic Handler is a concept to return dynamic content. It is used to return ajax calls, image from a query string, write XML, or any other data.


1 Answers

In ASP.NET 4.5 is the HttpTaskAsyncHandler. You can use it like this:

public class MyHandler : HttpTaskAsyncHandler {

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

}
like image 108
Václav Dajbych Avatar answered Sep 21 '22 14:09

Václav Dajbych