2012-04-25 22 views
10

いくつかのWebサイトを実行しているサーバー上でDateTime.Nowに例外がスローされています。これは、過去3日間で2倍になった。本当に奇妙です。私は、これは最新のWindows Updateで、あなたのいずれかが、同様の挙動が来る見ている場合に発生することが開始されているかどうかを疑問に思ってDateTime.Nowが例外をスローしています

をスローされた例外は、次のとおりです。

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を実行しており、英語(英国)ロケールを実行しています。

ありがとうございました。

+1

これは、原因となった厄介なWindows Updateのようなものです。実際に.NETのインストールが破損しているようです... – Noldorin

+0

完全なスタックトレースを提供できますか?多分これには何か関係がありますか? http://blog.brianhartsock.com/2009/02/21/systemargumentoutofrangeexcept-at-systemwebhttpcachepolicyutcsetlastmodifieddatetime-utcdate/ – mellamokb

+0

これは起こりそうにないかもしれませんが、システム時刻が正しく設定されていることがわかりましたか? – hatchet

答えて

0

これは、DateTime.Nowがスレッドセーフではないことが原因である可能性があります(これはバグと思われます)。私はそのバグを持つ.netのいくつかのバージョンについて聞いたことがあります。 DateTime.Nowへのすべての呼び出しが同様に扱われなければならないので、コードの行をロックで囲むことは必ずしも役立たないでしょう。回避策として、私は、同様の質問の人が何をしたかをお勧めします - DateTime.Nowによってスローされた例外をトラップし、もう一度試してください。

DateTime.Nowを複数のスレッドに呼び出す小さなテストアプリケーションを作成して、強制的にそれが原因であるかどうかを確認することはできますか?

問題のWebサイトで使用されている.Netのバージョンは何ですか?

+0

すべてのDateTimeメンバーはスレッドセーフです。 – porges

+0

@Porges - これも私の理解です。しかし、それは1つの呼び出しで失敗した場合、すぐにDateTime.Nowを再度呼び出すことによって成功した他の同様のstackoverflow質問の症状に適合します。 – hatchet

+0

.NET Frameworkが使用されています.NET Framework 4 –

1

Reflectorのコードを確認すると、裏地付きのAddDaysTransitionTimeToDateTimeの不良データが指定されていると例外が発生しています。

transitionTime

rule.DaylightTransitionStart又はrule.DaylightTransitionEndGetDaylightTimeからであるAddDaysプロセスtransitionTime.DayOfWeekの両方の出現(ならびにtime.DayOfWeekが、これは常にMod 7あります)。

GetTimeZoneInformationは、を呼び出すGetOneYearLocalFromUtcAdjustmentRuleが生成された場合に不良データを返すことがあります。

めったに起きていないので、レジストリが壊れているとは思えません(毎回発生すると思います)。TIME_ZONE_INFORMATIONのMSDNドキュメントでレジストリエントリについて詳しく説明しています。チェックする。

(もちろんDSTがちょうど変更されているか、またはユーザが現在のタイムゾーンを変更している可能性として行うには正しいものです)(注)この情報がキャッシュされていない、あなたはDateTime.Nowを呼び出すたびに取り出され、Aできるだけ早くDateTime.UtcNowを使用し、ユーザーに時間を表示する必要がある場合にのみ.ToLocalTimeを適用することによって、早すぎる最適化の良い言い訳です。

関連する問題