我在Global.asax中实现定时发送邮件,并记录到数据表中的需求,现在邮件可以发送成功,但往数据表Insert的时候总是出现【未将对象引用到实例】,如图:
单独拿出来放在普通.aspx.cs里执行可以(参数一样),为什么在Global.asax里就会出现这样的错误呢? 是不是有什么限制?请知道的朋友赐教,谢谢。
附:在Global.asax中的代码如下:
try { //smtp.Send(message); TradeSite.WebSiteSet.Model.IEmailQueueInfo4 emailinfo = new TradeSite.WebSiteSet.Model.EmailQueueInfo(); //emailinfo.EmailPriority = 0; //emailinfo.BodyFormat = 0; emailinfo.strEmailTo = MailTo; emailinfo.strEmailFrom = MailFrom; emailinfo.strEmailSubject = MailSubject; emailinfo.strEmailBody = MailContent; emailinfo.dtCreateDate = DateTime.Now; emailinfo.dtSendDate = DateTime.Now; //emailinfo.esEmailStatus = -1; emailinfo.EmailBodyFormat = System.Web.Mail.MailFormat.Html; emailinfo.strEmailError = ""; emailinfo.strURL = ""; if (emailinfo != null) { TradeSite.WebSiteSet.BLL.EmailQueue.Insert(emailinfo); } } catch (Exception ex) { throw ex; }
在普通.aspx.cs中执行的代码如下:
TradeSite.WebSiteSet.Model.IEmailQueueInfo4 emailinfo = new TradeSite.WebSiteSet.Model.EmailQueueInfo(); //emailinfo.EmailPriority = 0; //emailinfo.BodyFormat = 0; emailinfo.strEmailTo = "skybirdzw@163.com"; emailinfo.strEmailFrom = "wxrczkw@163.com"; emailinfo.strEmailSubject = "测试"; emailinfo.strEmailBody = "测试111"; emailinfo.dtCreateDate = DateTime.Now; emailinfo.dtSendDate = DateTime.Now; //emailinfo.esEmailStatus = -1; emailinfo.EmailBodyFormat = System.Web.Mail.MailFormat.Html; emailinfo.strEmailError = ""; emailinfo.strURL = ""; TradeSite.WebSiteSet.BLL.EmailQueue.Insert(emailinfo);
代码是放在Global.asax 的哪个方法中的?
这是整个Global.asax中的测试代码,我在Application_Start中调用其他方法,这些被调用的方法都写在Global.asax中的。
using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.Security; using System.Web.SessionState; namespace WebApplication2 { public class Global : System.Web.HttpApplication { protected string fromEmailAddress = "wxrczkw@163.com"; protected string fromEmailUser = "wxrczkw"; protected string fromEmailPassWord = "******"; protected string fromEmailSMTP = "smtp.163.com"; void Application_Start(object sender, EventArgs e) { System.Timers.Timer timer = new System.Timers.Timer(10000); timer.Elapsed += new System.Timers.ElapsedEventHandler(timer_Elapsed); timer.AutoReset = true; timer.Enabled = true; } void timer_Elapsed(object sender, System.Timers.ElapsedEventArgs e) { if (DateTime.Now.Hour == 18) { ScanMember(); } } void ScanMember() { IList<TradeSite.Member.Model.MemberInfo> memberinfolist = TradeSite.Member.BLL.Member.GetAll(); if (memberinfolist.Count > 0) { foreach (TradeSite.Member.Model.MemberInfo memberinfo in memberinfolist) { if (memberinfo.ID == 469) { SendMail(fromEmailAddress, memberinfo.EMail, "网站未登录提醒", "您已经一个月未登录本站了!【rczkw.com】"); } } } } public void SendMail(string MailFrom, string MailTo, string MailSubject, string MailContent) { System.Net.Mail.MailMessage message = new System.Net.Mail.MailMessage(); message.To.Add(MailTo); message.Subject = MailSubject; message.From = new System.Net.Mail.MailAddress(MailFrom); message.Body = MailContent; System.Net.Mail.SmtpClient smtp = new System.Net.Mail.SmtpClient("smtp.163.com"); smtp.Credentials = new System.Net.NetworkCredential("wxrczkw", "******"); try { smtp.Send(message); TradeSite.WebSiteSet.Model.IEmailQueueInfo4 emailinfo = new TradeSite.WebSiteSet.Model.EmailQueueInfo(); emailinfo.strEmailTo = MailTo; emailinfo.strEmailFrom = MailFrom; emailinfo.strEmailSubject = MailSubject; emailinfo.strEmailBody = MailContent; emailinfo.dtCreateDate = DateTime.Now; emailinfo.dtSendDate = DateTime.Now; emailinfo.EmailBodyFormat = System.Web.Mail.MailFormat.Html; emailinfo.strEmailError = ""; emailinfo.strURL = ""; if (emailinfo != null) { TradeSite.WebSiteSet.BLL.EmailQueue.Insert(emailinfo); } } catch (Exception ex) { throw ex; } } /// <summary> /// 计算两个日期的时间间隔 /// </summary> /// <param name="DateTime1">第一个日期和时间</param> /// <param name="DateTime2">第二个日期和时间</param> /// <returns>返回天数</returns> private int DateDiff(DateTime DateTime1, DateTime DateTime2) { int dateDiff = 0; TimeSpan ts1 = new TimeSpan(DateTime1.Ticks); TimeSpan ts2 = new TimeSpan(DateTime2.Ticks); TimeSpan ts = ts1.Subtract(ts2).Duration(); dateDiff = Convert.ToInt32(ts.Days); return dateDiff; } protected void Session_Start(object sender, EventArgs e) { } protected void Application_BeginRequest(object sender, EventArgs e) { } protected void Application_AuthenticateRequest(object sender, EventArgs e) { } protected void Application_Error(object sender, EventArgs e) { } protected void Session_End(object sender, EventArgs e) { } protected void Application_End(object sender, EventArgs e) { } } }
@skybirdzw: 把 try { 移至 if (emailinfo != null) 上面,确认是不是 TradeSite.WebSiteSet.BLL.EmailQueue.Insert(emailinfo); 引发的异常?
@dudu: 还是报一样的错:
try { if (emailinfo != null) { //换成这样写法也不行 TradeSite.WebSiteSet.BLL.EmailQueue bll = (TradeSite.WebSiteSet.BLL.EmailQueue)Assembly.Load("TradeSite.WebSiteSet.Component").CreateInstance("TradeSite.WebSiteSet.BLL.EmailQueue"); bll.InsertData(emailinfo); } } catch (Exception ex) { throw ex; }
@skybirdzw: 那可能是 Assembly.Load("TradeSite.WebSiteSet.Component").CreateInstance("TradeSite.WebSiteSet.BLL.EmailQueue"); 返回的是null。
@dudu: 其实我觉得就是 TradeSite.WebSiteSet.BLL.EmailQueue.Insert(emailinfo);执行的时候出现的错误;我仔细查看了方法并没有发现什么异常写法,以下附上,请各位参考下:
//BLL层 public static void Insert(IEmailQueueInfo4 info) { IDAL.IEmailQueue dal = DALFactory.EmailQueue.Create(); dal.Insert(info); } //DAL层 public void Insert(IEmailQueueInfo4 info) { if (info != null) { GetInsertParameters(info); ExecuteNonQuery(); } } private void GetInsertParameters(IEmailQueueInfo4 info) { cmd = db.GetSqlStringCommand(SQL_INSERT); db.AddInParameter(cmd, PARM_PRIVORITY, DbType.Int32, (int)info.EmailPriority); db.AddInParameter(cmd, PARM_BODY_FORMAT, DbType.Int32, info.EmailBodyFormat); db.AddInParameter(cmd, PARM_TO, DbType.String, info.strEmailTo); db.AddInParameter(cmd, PARM_CC, DbType.String, info.strEmailCc); db.AddInParameter(cmd, PARM_BCC, DbType.String, info.strEmailBcc); db.AddInParameter(cmd, PARM_FROM, DbType.String, info.strEmailFrom); db.AddInParameter(cmd, PARM_SUBJECT, DbType.String, info.strEmailSubject); db.AddInParameter(cmd, PARM_BODY, DbType.String, info.strEmailBody); db.AddInParameter(cmd, PARM_CREAT_DATE, DbType.DateTime, info.dtCreateDate = DateTime.Now); db.AddInParameter(cmd, PARM_SEND_DATE, DbType.DateTime, info.strSendDate); db.AddInParameter(cmd, PARM_STATUS, DbType.Int32, (int)info.esEmailStatus); db.AddInParameter(cmd, PARM_URL, DbType.String, HttpContext.Current.Request.RawUrl); db.AddInParameter(cmd, PARM_ERROR, DbType.String, info.strEmailError); } public void ExecuteNonQuery() { if (db != null && cmd != null) { db.ExecuteNonQuery(cmd); } }
@skybirdzw: 建议找出null究竟在哪里出现的,比如在 dal.Insert(info); 之前加上代码:
if(dal == null) { throw new Exception("dal is null"); }
@dudu: 彻底崩溃。。
加了异常输出却没执行到,说明对象都不是null啊,我是这样加的:
//BLL层 public static void Insert(IEmailQueueInfo4 info) { IDAL.IEmailQueue dal = DALFactory.EmailQueue.Create(); if (dal == null) { throw new Exception("dal is null"); } else { dal.Insert(info); } } public void InsertData(IEmailQueueInfo4 info) { IDAL.IEmailQueue dal = DALFactory.EmailQueue.Create(); if (dal == null) { throw new Exception("dal is null"); } else { dal.Insert(info); } }
Global.asax.cs中在操作之前也加了,同样没执行到,一下就跳到了throw ex;
TradeSite.WebSiteSet.BLL.EmailQueue bll = (TradeSite.WebSiteSet.BLL.EmailQueue)Assembly.Load("TradeSite.WebSiteSet.Component").CreateInstance("TradeSite.WebSiteSet.BLL.EmailQueue"); if (bll == null) { throw new Exception("bll is null"); } else { bll.InsertData(emailinfo); }
@skybirdzw: 注释掉 smtp.Send(message); 与 TradeSite.WebSiteSet.BLL.EmailQueue.Insert(emailinfo); 看会不会出现异常。
@dudu: 找到问题所在了!原来是DAL层的 GetInsertParameters方法搞的鬼!里面有一个给参数赋值:db.AddInParameter(cmd, PARM_URL, DbType.String, HttpContext.Current.Request.RawUrl == null ? "" : HttpContext.Current.Request.RawUrl);
而HttpContext.Current.Request.RawUrl似乎只对单次请求有效,在回发状态请求中就是null!
虽然郁闷了半天,好在终于知道问题所在了,谢谢你!
看看异常的详细信息啊,第几行代码出错,空引用的异常最容易解决了。
我觉得是 TradeSite.WebSiteSet.BLL.EmailQueue.Insert(emailinfo);有问题
你的EmailQueue是不是需要初始化,在木有初始化的时候就调用了静态方法
TradeSite.WebSiteSet.Model.IEmailQueueInfo4 emailinfo = new TradeSite.WebSiteSet.Model.EmailQueueInfo(); //emailinfo.EmailPriority = 0; //emailinfo.BodyFormat = 0; emailinfo.strEmailTo = "skybirdzw@163.com"; emailinfo.strEmailFrom = "wxrczkw@163.com"; emailinfo.strEmailSubject = "测试"; emailinfo.strEmailBody = "测试111"; emailinfo.dtCreateDate = DateTime.Now; emailinfo.dtSendDate = DateTime.Now; //emailinfo.esEmailStatus = -1; emailinfo.EmailBodyFormat = System.Web.Mail.MailFormat.Html; emailinfo.strEmailError = ""; emailinfo.strURL = "";
这些就是初始化的啊。单独拿出来执行就没问题,放在Global.asax中就不行了。
@skybirdzw: 你说的这个是IEmailQueueInfo4的实例化
我说的是EmailQueue的初始化,里面是不是有一些静态变量需要初始化
@Sanco: 这是BLL层方法代码:
/// <summary> /// 插入数据 /// </summary> /// <param name="info"></param> public static void Insert(IEmailQueueInfo4 info) { IDAL.IEmailQueue dal = DALFactory.EmailQueue.Create(); dal.Insert(info); }
里面没有任何静态成员的。
跟踪一下,看看具体是什么对象为空!
跟踪不了,项目是分模块编译后放在服务器上拼起来的,只能分模块调试,在引用到其他模块时就跟踪不到了。
@skybirdzw: 把异常的详细信息贴出来看看。详细信息里面会说运行到哪行出错了,会说那个对象为null.
@zqwuwei:
显示在跟踪信息是:
在 WebApplication2.Global.SendMail(String MailFrom, String MailTo, String MailSubject, String MailContent) 位置 G:\WebApplication2\WebApplication2\Global.asax.cs:行号 141
在 WebApplication2.Global.ScanMember() 位置 G:\WebApplication2\WebApplication2\Global.asax.cs:行号 61
在 WebApplication2.Global.timer_Elapsed(Object sender, ElapsedEventArgs e) 位置 G:\WebApplication2\WebApplication2\Global.asax.cs:行号 44
在 System.Timers.Timer.MyTimerCallback(Object state)
-------------------
显示的行号对应的代码:
行号 141:throw ex;
行号 61: SendMail(fromEmailAddress, memberinfo.EMail, "网站未登录提醒", "您已经一秒钟未登录本站了!【rczkw.com】");
行号 44:ScanMember();
将.aspx.cs 文件中的命名空间 引用到 在Global.asax中试一下。
.aspx.cs就比Global.asax.cs多了这两个引用:
using System.Web.UI;
using System.Web.UI.WebControls;
我怀疑你的dbhelpr 有执行顺序问题
没有吧,不放在Global.asax里就能运行正常,我崩溃了!