2011-11-28 21 views
8

Tengo un formulario en mi sitio web que envía json al controlador asíncrono que valida los datos y devuelve la resonancia OK o error y haré la redirección en el cliente en función de la respuesta dada por mi controlador.haciendo llamadas asíncronas desde el controlador genérico (.ashx)

Pero cuando la respuesta es correcta, quiero realizar algunas tareas de forma asincrónica. Pero las llamadas asincrónicas no funcionan dentro del código .ashx. siempre es sincrónico

¿Podría darme un consejo al respecto?

código:

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); 

PD: Hice ocultar algo de código que es sólo nuestra business.But Sería muy bueno si se puede comentar sobre eso.

gracias chicos

Respuesta

6

Se necesitan implmement IHttpAsyncHandler en lugar de IHttpHandler y registrarlo como tal en el archivo web.config. Los exploradores también observarán los límites de conexión, así que asegúrese de IIS está configurado adecuadamente para manejar múltiples conexiones, mantenimiento de conexión, etc.

Aquí es una guía detallada: http://msdn.microsoft.com/en-us/library/ms227433.aspx

+0

Gracias luckiffer, funciona. – sbmandav

17

En ASP.NET 4.5 es la HttpTaskAsyncHandler. Puede usarlo así:

public class MyHandler : HttpTaskAsyncHandler { 

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

} 
Cuestiones relacionadas