2012-04-25 23 views
10

Tôi nhận được một ngoại lệ được ném vào DateTime.Now trên máy chủ của chúng tôi đang chạy một vài trang web. Điều này đã xảy ra hai lần với tôi trong 3 ngày qua. Rất lạ. Tôi đang tự hỏi liệu điều này đã bắt đầu xảy ra với bản cập nhật mới nhất của Windows và nếu bất kỳ của bạn đã thấy hành vi tương tự sắp tới trongDateTime.Now đang gửi một ngoại lệ

Trường hợp ngoại lệ ném là:.

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) 

Mã nơi này xảy ra là người đầu tiên dòng trong lệnh if-:

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

Mặc dù có một AddHours trong đó và các ngoại lệ được nói về DateTime.Add, tôi không tin rằng nó có bất cứ điều gì để làm với AddHours, nhưng là do gọi đến Now như bạn có thể thấy trong stack trace.

Máy chủ tôi đang chạy đang chạy Windows Server 2003 và đang chạy ngôn ngữ tiếng Anh (Vương quốc Anh).

Cảm ơn bạn đã được trợ giúp.

+1

Nghe có vẻ giống như một bản cập nhật Windows tinh vi gây ra sự cố hoặc cài đặt bị hỏng .NET ... – Noldorin

+0

Bạn có thể cung cấp dấu vết ngăn xếp đầy đủ không?Có lẽ điều này có liên quan gì đến nó? http://blog.brianhartsock.com/2009/02/21/systemargumentoutofrangeexception-at-systemwebhttpcachepolicyutcsetlastmodifieddatetime-utcdate/ – mellamokb

+0

Tôi biết điều này có vẻ khó xảy ra, nhưng thời gian hệ thống đã được đặt chính xác chưa? – hatchet

Trả lời

0

Điều này có thể do DateTime.Now không phải là chủ đề an toàn (mà tôi tin là lỗi). Tôi đã nghe nói về một số phiên bản của .net có lỗi đó. Nó sẽ không nhất thiết giúp đỡ để bọc dòng mã của bạn trong một khóa, bởi vì tất cả các cuộc gọi đến DateTime.Now sẽ phải được xử lý tương tự. Để giải quyết vấn đề này, tôi khuyên bạn nên làm những gì mà một người trong câu hỏi tương tự đã làm - bẫy trường hợp ngoại lệ được ném bởi DateTime.Now và thử lần thứ hai.

Bạn có thể viết một ứng dụng thử nghiệm nhỏ gọi DateTime.Now nhiều lần trên nhiều chủ đề để ép buộc và xác minh xem đó có phải là nguyên nhân không?

Phiên bản .Net nào đang được sử dụng bởi các trang web được đề cập?

+0

Tất cả thành viên DateTime đều an toàn. – porges

+0

@ Porges - Đó cũng là sự hiểu biết của tôi. Nhưng nó phù hợp với các triệu chứng, đặc biệt là các câu hỏi stackoverflow tương tự khác, nơi nếu nó không thành công trên một cuộc gọi, nó đã thành công bằng cách gọi ngay lập tức DateTime.Now một lần nữa. – hatchet

+0

Khuôn khổ .NET được sử dụng là .NET Framework 4 –

1

Xem lại mã trong Trình phản xạ, ngoại lệ của bạn đang xảy ra khi một số liệu xếp hàng AddDays trong hàng được cung cấp dữ liệu không hợp lệ trong TransitionTimeToDateTime.

Cả hai lần xuất hiện của AddDays quá trình transitionTime.DayOfWeek nơi transitionTimerule.DaylightTransitionStart hoặc rule.DaylightTransitionEnd từ GetDaylightTime (cũng như time.DayOfWeek, nhưng điều này luôn luôn là Mod 7).

Điều này có nghĩa là GetTimeZoneInformation thỉnh thoảng trả về dữ liệu không hợp lệ trong đó AdjustmentRule được tạo trong GetOneYearLocalFromUtc gọi GetCurrentOneYearLocal.

Vì nó hiếm khi xảy ra, tôi không nghĩ rằng nó sẽ do đăng ký bị hỏng (tôi mong đợi nó sẽ xảy ra mọi lúc), nhưng để giúp kiểm tra thêm tài liệu MSDN TIME_ZONE_INFORMATION mô tả các mục đăng ký để kiểm tra.

Lưu ý thông tin này không được lưu trữ và được lấy ra mỗi khi bạn gọi DateTime.Now, (đó là tất nhiên những điều đúng để làm như DST có thể chỉ cần thay đổi, hoặc người dùng có thể đã thay đổi múi giờ hiện tại) một lý do tốt cho một số tối ưu hóa sớm bằng cách sử dụng DateTime.UtcNow càng nhiều càng tốt và chỉ áp dụng .ToLocalTime khi bạn cần hiển thị thời gian cho người dùng.

Các vấn đề liên quan