DateTime.Now正在抛出异常

时间:2012-04-25 21:12:57

标签: .net exception datetime

我在运行几个网站的服务器上的DateTime.Now上抛出异常。在过去的3天里,这对我来说已经发生了两次。真奇怪。我想知道这是否已经开始与最新的Windows Update一起发生,如果你们中有人看到过类似的行为。

抛出的异常是:

BASE EXCEPTION:
  TYPE: System.ArgumentOutOfRangeException
  MESSAGE: Value to add was out of range.
Parameter name: value
  STACK TRACE:
   at System.DateTime.Add(Double value, Int32 scale)
   at System.TimeZoneInfo.TransitionTimeToDateTime(Int32 year, TransitionTime transitionTime)
   at System.TimeZoneInfo.GetDaylightTime(Int32 year, AdjustmentRule rule)
   at System.TimeZoneInfo.GetIsDaylightSavingsFromUtc(DateTime time, Int32 Year, TimeSpan utc, AdjustmentRule rule, Boolean& isAmbiguousLocalDst)
   at System.TimeZoneInfo.GetDateTimeNowUtcOffsetFromUtc(DateTime time, Boolean& isAmbiguousLocalDst)
   at System.DateTime.get_Now()
   at (my code).FrontEnd.FrontEndPage.Page_Load(Object sender, EventArgs e) in (my code file)\code\presentation\FrontEndPage.cs:line 118
   at (my code).purchase.Page_Load(Object sender, EventArgs e) in (my code file)\purchase.aspx.cs:line 94
   at System.Web.Util.CalliHelper.EventArgFunctionCaller(IntPtr fp, Object o, Object t, EventArgs e)
   at System.Web.Util.CalliEventHandlerDelegateProxy.Callback(Object sender, EventArgs e)
   at System.Web.UI.Control.OnLoad(EventArgs e)
   at System.Web.UI.Control.LoadRecursive()
   at System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint)

发生这种情况的代码是if语句中的第一行:

HttpCookie loggedIn = Request.Cookies[Config.Instance.LoggedInCookieName];
if (loggedIn != null)
{
    loggedIn.Expires = DateTime.Now.AddHours(4);
    Response.Cookies.Add(loggedIn);
}

虽然那里有一个AddHours而且异常是在谈论DateTime.Add,但我不认为它与AddHours有任何关系,但是由于你在堆栈跟踪中看到的调用Now而引起

我所在的服务器正在运行Windows Server 2003,并且正在运行英语(英国)语言环境。

感谢您的帮助。

2 个答案:

答案 0 :(得分:1)

查看Reflector中的代码时,如果在AddDays中为内联TransitionTimeToDateTime提供错误数据,则会发生异常。

AddDays处理transitionTime.DayOfWeek transitionTime rule.DaylightTransitionStart rule.DaylightTransitionEndGetDaylightTime来自time.DayOfWeek(以及Mod 7 ,但这总是GetTimeZoneInformation)。

这似乎意味着AdjustmentRule偶尔会在GetOneYearLocalFromUtc中生成GetCurrentOneYearLocal并调用DateTime.Now的情况下返回错误数据。

因为它很少发生,我认为这不会是由于注册表损坏(我希望它每次都会发生。),但是为了帮助进一步检查TIME_ZONE_INFORMATION的MSDN文档,要检查的注册表项。

<子> 请注意,此信息不会被缓存,并且每次调用DateTime.UtcNow时都会被检索(当然,正确的事情可以做,因为DST可能刚刚更改,或者用户可能已经更改了当前时区)这是一个很好的借口通过尽可能使用.ToLocalTime进行一些过早优化,并仅在需要向用户显示时间时应用{{1}}。

答案 1 :(得分:0)

这可能是由DateTime引起的。现在不是线程安全的(我认为这是一个bug)。我听说有一些版本的.net有这个bug。将您的代码行包装在锁中并不一定有用,因为必须对所有对DateTime.Now的调用进行类似的处理。作为一种解决方法,我建议做类似问题中的人所做的事情 - 捕获DateTime.Now抛出的异常并再次尝试。

你能写一个小的测试应用程序,在多个线程上多次调用DateTime.Now来强制它并验证这是否是原因?

相关网站正在使用哪个版本的.Net?

相关问题