2011-11-28 26 views
8

Tôi có một biểu mẫu trong trang web của tôi gửi json đến trình xử lý async xác nhận dữ liệu và trả về OK hoặc lỗi phản hồi và tôi sẽ thực hiện chuyển hướng trên máy khách dựa trên câu trả lời được đưa ra bởi người xử lý của tôi.làm cho các cuộc gọi không đồng bộ hình thức xử lý chung (.ashx)

Nhưng khi phản hồi là ok, tôi muốn thực hiện một số tác vụ không đồng bộ. Nhưng các cuộc gọi không đồng bộ không hoạt động bên trong mã .ashx. nó luôn đồng bộ.

Bạn có thể cho tôi lời khuyên về điều này không?

mã:

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: Tôi đã giấu một số mã mà chỉ là business.But của chúng tôi Sẽ là tuyệt vời nếu bạn có thể bình luận về điều đó.

nhờ kẻ

Trả lời

6

Bạn cần phải implmement IHttpAsyncHandler hơn IHttpHandler và đăng ký nó như vậy trong file web.config. Các trình duyệt cũng sẽ quan sát giới hạn kết nối, do đó hãy chắc chắn rằng IIS được cấu hình đúng cách để xử lý nhiều kết nối, giữ-sống vv

Dưới đây là một hướng dẫn chi tiết: http://msdn.microsoft.com/en-us/library/ms227433.aspx

+0

Cảm ơn luckiffer, nó hoạt động. – sbmandav

17

Trong ASP.NET 4.5 là HttpTaskAsyncHandler. Bạn có thể sử dụng nó như thế này:

public class MyHandler : HttpTaskAsyncHandler { 

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

} 
Các vấn đề liên quan