2011-11-28 13 views
8

मेरे पास मेरी वेबसाइट में एक फॉर्म है जो जेसन को एसिंक हैंडलर पर पोस्ट करता है जो डेटा को मान्य करता है और रिज़ॉन्स ओके या त्रुटि वापस लौटाता है और मैं क्लाइंट पर रीडायरेक्ट कर दूंगा प्रतिक्रिया मेरे हैंडलर द्वारा देते हैं।एसिंक्रोनस कॉल फॉर्म जेनेरिक हैंडलर (.ashx)

लेकिन जब प्रतिक्रिया ठीक है, तो मैं कुछ कार्यों को असंकालिक रूप से करना चाहता हूं। लेकिन एसिंक्रोनस कॉल .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); 

पुनश्च: मैं कुछ कोड है जो हमारे business.But अगर आपको लगता है कि उस पर टिप्पणी करने में मज़ा नहीं आएगा छिपाने किया था।

धन्यवाद लोग

उत्तर

6

आप IHttpAsyncHandler बजाय IHttpHandler implmement और web.config फ़ाइल में इस तरह के रूप में यह रजिस्टर करने के लिए की जरूरत है। ब्राउज़र भी कनेक्शन सीमा का पालन करेंगे, तो यकीन है कि आईआईएस कई कनेक्शन को संभालने के लिए ठीक से कॉन्फ़िगर किया गया है, जीवित-रखें, आदि

यहाँ में विस्तृत जानकारी के है: http://msdn.microsoft.com/en-us/library/ms227433.aspx

+0

धन्यवाद luckiffer, यह काम करता है। – sbmandav

17

ASP.NET 4.5 में HttpTaskAsyncHandler है। आप इसे इस तरह उपयोग कर सकते हैं:

public class MyHandler : HttpTaskAsyncHandler { 

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

} 
संबंधित मुद्दे