2016-01-14 3 views
0

Мой сценарий заключается в отправке информации о счете (в формате PDF) в адрес электронной почты клиента по событию клика в paynow.TranscationScope с несколькими вызовами базы данных

Я попытался следующие, но получаю исключение после вызова

actionPDF.BuildPdf(ControllerContext) 

Исключение составляет

Время ожидания истекло. Время ожидания истекло до завершения операции или сервер не отвечает

Код:

dbDetails _db = new dbDetails(); 

[HttpPost] 
public JsonResult Add(Model mdl) 
{ 
    using (TransactionScope _ts = new TransactionScope()) 
    { 
     //Insertion logic of invoice goes here 
     ... 
     ... 

     int i = _db.SaveChanges(); 

     // if successfull insertion 
     if(i > 0) 
     { 
      var actionPDF = new Rotativa.ActionAsPdf("GetPdfReceipt", new { RegId = _receiptDetails.StudentRegistrationID.Value }) 
      { 
       FileName = "Receipt.pdf" 
      }; 

      // Dynamic student receipt pdf 
      ***Getting exception here**** 
      var byteArrayDynamic = actionPDF.BuildPdf(ControllerContext); 

      // Mail sending logic 
      ...... 
      ...... 

      _ts.Complete(); 
     } 
    } 
} 

public ActionResult GetPdfReceipt(int RegId) 
{ 
    Common _cmn = new Common(); 
    var _studentRegistration = _db.StudentRegistrations 
           .AsEnumerable() 
           .Where(r => r.Id == RegId) 
           .FirstOrDefault(); 

    var _mdlReceiptPdf = new ReceiptPdfVM 
    { 
     CentreCode = _studentRegistration.StudentWalkInn.CenterCode.CentreCode, 
     CompanyAddress = _studentRegistration.StudentWalkInn.CenterCode.Address, 
     CompanyPhoneNo = _studentRegistration.StudentWalkInn.CenterCode.PhoneNo, 
     CourseFee = _studentRegistration.TotalCourseFee.Value, 
     CourseTitle = string.Join(",", _studentRegistration.StudentRegistrationCourses 
               .Select(rc => rc.MultiCourse.CourseSubTitle.Name)), 
     CROName = _studentRegistration.StudentWalkInn.CROCount == (int)EnumClass.CROCount.ONE ? _studentRegistration.StudentWalkInn.Employee1.Name : 
                            _studentRegistration.StudentWalkInn.Employee1.Name + ',' + _studentRegistration.StudentWalkInn.Employee2.Name, 
     Duration = _studentRegistration.TotalDuration.Value, 
     ReceiptDate = _studentRegistration.StudentReceipts.Last(sr => sr.Status == true).DueDate.Value.ToString("dd/MM/yyyy"), 
     ReceiptNo = _studentRegistration.StudentReceipts.Last(sr => sr.Status == true).ReceiptNo, 
     RegistrationNumber = _studentRegistration.RegistrationNumber, 
     ServiceTax = _studentRegistration.TotalSTAmount.Value, 
     StudentMaskedEmailId = _cmn.MaskString(_studentRegistration.StudentWalkInn.EmailId, "email"), 
     StudentMaskedMobileNo = _cmn.MaskString(_studentRegistration.StudentWalkInn.MobileNo, "mobile"), 
     StudentName = _studentRegistration.StudentWalkInn.CandidateName, 
     ServiceTaxRegistrationNo = _studentRegistration.StudentWalkInn.CenterCode.STRegNo, 
     TotalAmount = _studentRegistration.TotalAmount.Value, 
     TotalAmountInWords = _cmn.NumbersToWords(_studentRegistration.TotalAmount.Value).ToUpper(), 
     TotalCourseFeePaid = _studentRegistration.StudentReceipts 
            .Where(r => r.Status == true) 
            .Sum(r => r.Fee.Value), 
     ManagerName = _cmn.GetManager(_studentRegistration.StudentWalkInn.CenterCodeId.Value) 
           .Name, 
     ReceiptDetailsList = _db.StudentReceipts 
             .AsEnumerable() 
             .Where(rc => rc.StudentRegistrationID == RegId) 
             .Select(rc => new ReceiptPdfVM.ReceiptDetails 
             { 
              CourseFee = rc.Fee.Value, 
              DatePaid = rc.DueDate.Value.ToString("dd/MM/yyyy"), 
              ReceiptNo = rc.ReceiptNo 
             }).ToList() 
    } 

    return View("Receipts", _mdlReceiptPdf); 
} 

protected override void Dispose(bool disposing) 
{ 
     _db.Dispose(); 
     base.Dispose(disposing); 
} 

Как решить эту проблему? Любая помощь будет высоко оценена.

+0

Вы выполняете какие-либо операции с базой данных после '_db.SaveChanges()'? – jvanrhyn

+0

Да, выберите операции для загрузки «Просмотр - квитанции», упомянутые в 'GetPdfReceipt()' – ksg

+0

Операторы выбора не должны участвовать в транзакции. Если все манипуляции с данными завершены, вы можете завершить транзакцию, а затем выполнить выбор. – jvanrhyn

ответ

0

Я думаю, проблема заключается в том, что при создании документа PDF ваши ожидающие транзакции базы данных истекают. Передвиньте _ts.Complete до создания PDF-файла.

dbDetails _db = new dbDetails(); 

[HttpPost] 
public JsonResult Add(Model mdl) 
{ 
    using (TransactionScope _ts = new TransactionScope()) 
    { 
     //Insertion logic of invoice goes here 
     ... 
     ... 
     int i= _db.SaveChanges(); 
     //if successfull insertion 
     if(i>0) 
     { 
      _ts.Complete(); 
      var actionPDF = new Rotativa.ActionAsPdf("GetPdfReceipt", new { RegId = _receiptDetails.StudentRegistrationID.Value }) 
      { 
       FileName = "Receipt.pdf" 
      }; 
      //Dynamic student receipt pdf 
      ***Getting exception here**** 
      var byteArrayDynamic = actionPDF.BuildPdf(ControllerContext); 

      //Mail sending logic 
      ...... 
      ...... 



     } 


    } 

} 
+0

Пробовал приведенный выше код, по-прежнему получая то же исключение. – ksg

+0

Единственная логическая причина, по которой я могу видеть сейчас, - это то, что один из запросов занимает много времени, поэтому нужно отключить ваше соединение. – jvanrhyn