4

WCF / C#3.5で記述されたクライアント/サーバーアプリケーションがあります。

サーバーは私のローカルタイムゾーンにあり、クライアントは世界中に広がっています。

私の現在の戦略は、サーバーとデータベースのあらゆる場所でUTC DateTimeを使用し、クライアントが受信したUTCDateTimeを正しく処理できるようにすることです。

これは、クライアントがメッセージを受信するたびに、その最初のタスクはメッセージに含まれるDateTimesをUTCからローカルに変換することであることを意味します。

このタスクを支援するために、すべての[DataContract]オブジェクトによって実装されるインターフェイスを定義しました。

public interface IConvertToLocalTime {
   void ConvertToLocalTime();
}

したがって、私は通常、サーバーからのメッセージを次のように処理します。

public void ServerCallbackFoo(MyObject a, MyObject2 b)
{
  a.ConvertToLocalTime();
  b.ConvertToLocalTime();
  // my business code goes there
}

これは問題なく機能しますが、変換メソッドを手動で呼び出さなければならないという事実にはあまり満足していません。

このタスクはWCFフレームワークによって管理する必要があるように思われます。私はそこに何かが欠けていますか?変換を自動化するためのより良い方法はありますか?

4

3 に答える 3

1

私の知る限り、WCFは時間変換を支援するための自動化を提供していません。個人的には、そうなるとは思っていません。

そして、私はあなたに同意します。変換ルーチンを手動で呼び出さなければならないのは理想的ではありません。エレガントな感じはしません。

私にとって、より洗練された解決策は、必要に応じてDateTimeを「怠惰に」評価することです。UTC時刻を現地時間に変換するために呼び出す必要のある関数を提供する代わりに、このロジックを各DateTimeプロパティのget関数内に配置します。これにより、DateTimeがオブジェクトから取得されるときに、自動的に現地時間に変換されます。

于 2009-02-04T14:38:15.627 に答える
1

質問を理解していない可能性がありますが、サービスとクライアントの両方に .NET を使用しているため、必要に応じて組み込みの DateTime.ToLocalTime と DateTime.ToUniversalTime を使用する方が簡単ではないでしょうか。.Kind プロパティをチェックして、DateTime がローカルか UTC かを確認できるはずです。

DateTime test = DateTime.Now; //already local time
DateTime LocalTest = test.ToLocalTime();
DateTime UtcTest = test.ToUniversalTime();

DateTime シリアライゼーションの処理に関するこの SO Questionも参照してください。

于 2009-02-04T20:46:29.797 に答える
0

ユーザーに情報を提示するときにクライアントを現地時間に正確に変換し、逆にユーザーが入力したデータを読み取るときに最初に変換することができます。その後、クライアントの残りの部分は UTC で動作します。

于 2012-10-31T20:19:55.973 に答える