2011-11-28 17 views
8

Ho un modulo nel mio sito Web che posta JSON al gestore async che convalida i dati e restituisce la risposta OK o errore e farò il reindirizzamento sul client basato su la risposta fornita dal mio gestore.fare chiamate asincrone formano gestore generico (.ashx)

Ma quando la risposta è ok, voglio eseguire alcune attività in modo asincrono. Ma le chiamate asincrone non funzionano all'interno del codice .ashx. è sempre sincrono.

Potrebbe per favore darmi un consiglio su questo?

codice:

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: ho fatto nascondere alcuni codice che è solo il nostro business.But sarebbe bello se si può commentare su questo.

grazie ragazzi

risposta

6

È necessario implmement IHttpAsyncHandler piuttosto che IHttpHandler e registrarlo come tale nel file web.config. I browser sarà anche osservare i limiti di connessione, in modo da assicurarsi IIS è configurato correttamente per gestire connessioni multiple, keep-alive, ecc

Ecco una passeggiata attraverso dettagliata: http://msdn.microsoft.com/en-us/library/ms227433.aspx

+0

Grazie luckiffer, funziona. – sbmandav

17

In ASP.NET 4.5 è il HttpTaskAsyncHandler. Puoi utilizzarlo in questo modo:

public class MyHandler : HttpTaskAsyncHandler { 

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

} 
Problemi correlati