我在运行几个网站的服务器上的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,并且正在运行英语(英国)语言环境。
感谢您的帮助。
答案 0 :(得分:1)
查看Reflector中的代码时,如果在AddDays
中为内联TransitionTimeToDateTime
提供错误数据,则会发生异常。
AddDays
处理transitionTime.DayOfWeek
transitionTime
rule.DaylightTransitionStart
rule.DaylightTransitionEnd
或GetDaylightTime
来自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?