生产服务器中MVC中的内部服务器错误500

时间:2020-07-21 06:16:30

标签: c# jquery ajax asp.net-mvc

在我的本地服务器和测试服务器中都可以正常工作。但是在将其部署到生产服务器中之后。

此功能使我收到内部服务器错误500。

除此功能外,所有功能均正常工作。

在视图中调用发送电子邮件的功能:

function ProcessSendingEmail(NextMRB, to, originator, owner, probDesc, hold_day, MRB_Type) 
{
       $.ajax({
              type: "POST",
              url: '@Url.Action("SendMailToFutureHold", "MRB")',
              data: { MRBNumber: NextMRB, MailTo: to, Originator: originator, Owner: owner, ProbDesc: probDesc, hold_days: hold_day, mrb_type: MRB_Type},
            success: function (data) {
                 console.log("Email Sent");
              },
              error: function (data) {
                  console.log("Email Not Sent");
              }
         });
}

控制器

[HttpPost]
public ActionResult SendMailToFutureHold(string MRBNumber, string MailTo, string Originator, string Owner, string ProbDesc, string hold_days, string mrb_type)
{
        MailId = Originator + "@domain.com";

        DataTable dt = MRB.GetDataForAttachmentForFH(MRBNumber, MailTo, mrb_type);

        byte[] bytes;
        //dt.Columns.RemoveAt(dt.Columns.Count - 1);
        dt.TableName = "MRB_Future_Hold_List_" + MRBNumber;

        Response.ClearContent();
        Response.Buffer = true;
        Response.AddHeader("content-disposition", "attachment;filename = MRB_Future_Hold_List_" + MRBNumber + ".csv");
        Response.ContentType = "text/csv";
        Response.Charset = "";

        using (StringWriter sw = new StringWriter())
        {
            int iColCount = dt.Columns.Count;
            int iRowcount = dt.Rows.Count;

            if (iRowcount != 0)
            {

                for (int i = 0; i < iColCount; i++)
                {
                    sw.Write(dt.Columns[i]);
                    if (i < iColCount - 1)
                    {
                        sw.Write(",");
                    }
                }

                sw.Write(sw.NewLine);

                foreach (DataRow dr in dt.Rows)
                {
                    for (int i = 0; i < iColCount; i++)
                    {
                        if (!Convert.IsDBNull(dr[i]))
                        {
                            sw.Write(dr[i].ToString());
                        }

                        if (i < iColCount - 1)
                        {
                            sw.Write(",");
                        }
                    }

                    sw.Write(sw.NewLine);
                }
            }
            else
            {
                sw.Write("Something went wrong. Please contact it_quality_support@domain.com");
            }

            using (HtmlTextWriter htw = new HtmlTextWriter(sw))
            {
                using (MemoryStream mStream = new MemoryStream(Encoding.ASCII.GetBytes(sw.ToString())))
                {
                    string messageBody = "<b>Originator :</b> " + Originator.ToUpper() + "<br> <b>Owner :</b> " + Owner.ToUpper() + "<br> <b>Problem Description :</b> <br>" + ProbDesc.ToUpper() + "<br><br><font> Attached file are the list of lots to put on MRB Hold. </font><br><br>";

                    bytes = mStream.ToArray();
                    Mail_Service sndmail = new Mail_Service("mailrelay.domain.com", "noreply-mrb@domain.com", MailTo, QA_Contact_Email + "," + MailId + ",it_quality_support@domain.com");
                    sndmail.Send_Mail("LOTS FOR MRB FUTURE HOLD", messageBody, bytes, MRBNumber);
                }

                Response.Flush();
                Response.End();
            }
        }

        return View();
}

如果有人可以帮助我。非常感谢。谢谢。

Error Result

2 个答案:

答案 0 :(得分:1)

问题不在于您的Javascript函数,而是您的控制器方法SendMailToFutureHold

从堆栈错误中,我们可以读取null reference exception object not set to an instance of an object

假设DataTable dt = MRB.GetDataForAttachmentForFH(MRBNumber, MailTo, mrb_type);已正确初始化(不为null)-

Response可能未初始化。

确定的唯一方法是进行一些日志记录-我知道这是调试生产代码的唯一方法。

您可以尝试log4net

答案 1 :(得分:1)

基本上,此问题与您front-end code无关。它来自您在back-end method中消费的Ajax call

我会说,在.cs方法中使用Try and Catch并在catch中记录错误。因为500 internal server error由于代码中的运行时错误而出现。

创建您自己的Logger类,可以在项目中实现Log4net并将日志写入服务器。这样,您就可以得到答案,是什么原因导致500 Internal Server中的Ajax Response错误

[HttpPost]
public ActionResult SendMailToFutureHold(string MRBNumber, string MailTo, string Originator, string Owner, string ProbDesc, string hold_days, string mrb_type)
{
Try
   {
         Your code just paste it here
         return View();
   }        
catch(Exception ex)
   {
         //Log the exception here with following things:- Stack Trace, Error
   }
}