在我的本地服务器和测试服务器中都可以正常工作。但是在将其部署到生产服务器中之后。
此功能使我收到内部服务器错误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();
}
如果有人可以帮助我。非常感谢。谢谢。
答案 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
}
}