0

日付情報を取得する場所に関するベスト プラクティス/パターン/意見を知りたいです。

それはプレゼンテーション層にあり、トランザクション メタデータの一部としてサーバーに送信されますか? それともサーバー上に作成されましたか?

私のアプリケーションでは、ユーザーが 1 つの国で「トランザクション」を作成する必要があります。また、他の人は、トランザクションが別の国で作成された現地時間を確認できる必要があります。

現在、ビジネスロジックレイヤーで日付をキャプチャしています。データ アクセス レイヤーでキャプチャした場合、同じ厄介な結果が得られると思います。

それを置く別の方法は、より良いものです:

サーバ側

[WebMethod()]
public TransactionItem SaveTransaction(int ID)
{
    TransactionItem transaction = new TransactionItem();
    transaction.ID = ID;
    transaction.TimeRequest = DateTime.Now; //<-- thinking this is my problem.
    new TransactionDAL().SaveTransaction(transaction);
    return transaction;
} 

また

クライアント側

[WebMethod()]
public TransactionItem SaveTransaction(int ID, DateTime TimeRequest)
{
    TransactionItem transaction = new TransactionItem();
    transaction.ID = ID;
    transaction.TimeRequest = TimeRequest; // <-- this might be better?
    new TransactionDAL().SaveTransaction(transaction);
    return transaction;
}
4

2 に答える 2

4

まず最初DateTimeに、サーバー側で排他的に UTC または「ズールー時間」で処理してください。クライアント側に到達したら、変換を処理します。

// on the server side
var serverNow = DateTime.UtcNow;
Console.WriteLine(serverNow);

// and on the client side
var myLocalNow = serverNow.ToLocalTime();
Console.WriteLine(myLocalNow);

一般的に、「今何時?」の最終決定者です。サーバーになる必要があります-それはあなたが最も直接制御できる世界です。クライアントの視点から見た時間は、サーバーによって上から配信される「The One True Time」から変換する必要があります。

もちろん、それは私の意見であり、Local->Server 時間の変換を処理するために何度もやけどを負ったことによってわずかに影響を受けました. (うーん)

于 2013-03-19T20:48:33.167 に答える
1

クライアントの現地時間でイベントを追跡する必要がある場合、クライアントでそれをキャプチャする以外に選択肢はありません。.NET (サンプル コードが C# のように見えるため、使用していると思われます) の場合、DateTimeOffsetは、個別に追跡されたタイム ゾーン情報と組み合わせた DateTime を使用するよりもはるかに便利なメカニズムを提供します。

残念ながら、クライアントでタイムスタンプをキャプチャすると、クライアントとサーバーのシステム時間に不一致がある場合、サーバー側の処理に潜在的な問題 (潜在的なセキュリティの問題を含む) が発生します。これに対処する簡単な方法は、クライアントがキャプチャした時間を現在のサーバー時間と比較し、それが許容範囲を超えている場合は拒否することです (例: サーバー時間のいずれかの方向に 5 分)。このテストに合格したとしても、クライアントがキャプチャしたタイムスタンプを直接保存しないでください。代わりに、クライアントのタイム ゾーンに変換されたサーバーの現在の時刻を使用する必要があります。

于 2013-03-21T17:56:07.157 に答える