2

私はこのシナリオを持っています:

サーバーは (GMT +3) タイムゾーンにあります

クライアントは (GMT -5) タイムゾーンにいます

サーバーはDateTimeクライアントに a を返します。たとえば、「10JAN2013 00:00」であり、DateTimeタイムゾーン情報が添付されていないとします。クライアント側の時間は、クライアントのタイムゾーン「09JAN2013 16:00」に変換されます! DTK.Unspecified に DTK を指定します。

DateTime私の質問ですが、タイムゾーン情報がない場合、クライアントはどのようにしてサーバーのタイムゾーンを知りましたか? これは私を混乱させます!SOAPのヘッダーなどで送信されますか?

4

1 に答える 1

1

彼らは知っているかもしれませんし、知らないかもしれません。クライアントとサーバーの間でオブジェクトが渡されるとDateTime、両者が理解できる共通の形式にシリアル化されます。XML などの一部の形式では、タイム ゾーン情報がネットワーク経由で送信されます。 DateTimewithがある場合はDateTimeKind.Utc、シリアル化された日付に「Z」が追加されます。Localタイムゾーンが追加され、何Unspecifiedも追加されないため、相手はどの形式を使用するかがわかります。JSON などの他の形式では、種類が の場合、サーバーは日付時刻で何も送信しませんが、他の種類のローカル タイム ゾーン情報を追加します (JSON 形式とUtcの区別はありません。受信側は IIRC です)。などの情報を扱います)。LocalUnspecifiedLocal

ネットワーク上で何が行われているかを確認したい場合は、Fiddler などのネットワーク キャプチャ ツールを使用して、以下のプログラムを実行し、クライアントがサーバーに何を送信しているかを確認できます。

public class StackOverflow_14132566
{
    [ServiceContract]
    public interface ITest
    {
        [OperationContract]
        [WebInvoke(RequestFormat = WebMessageFormat.Json, 
                   ResponseFormat = WebMessageFormat.Json,
                   BodyStyle = WebMessageBodyStyle.WrappedRequest)]
        DateTime Add10Hours(DateTime input, string description);
    }
    public class Service : ITest
    {
        public DateTime Add10Hours(DateTime input, string description)
        {
            return input.AddHours(10);
        }
    }
    public static void Test()
    {
        string baseAddress = "http://" + Environment.MachineName + ":8000/Service";
        ServiceHost host = new ServiceHost(typeof(Service), new Uri(baseAddress));
        host.AddServiceEndpoint(typeof(ITest), new BasicHttpBinding(), "basic");
        host.AddServiceEndpoint(typeof(ITest), new WebHttpBinding(), "web").Behaviors.Add(new WebHttpBehavior());
        host.Open();
        Console.WriteLine("Host opened");

        ChannelFactory<ITest> factory = new ChannelFactory<ITest>(new BasicHttpBinding(), new EndpointAddress(baseAddress + "/basic"));
        ITest proxy = factory.CreateChannel();
        Console.WriteLine(proxy.Add10Hours(new DateTime(2013, 1, 2, 19, 29, 0, DateTimeKind.Utc), "XML, UTC"));
        Console.WriteLine(proxy.Add10Hours(new DateTime(2013, 1, 2, 19, 29, 0, DateTimeKind.Local), "XML, Local"));
        Console.WriteLine(proxy.Add10Hours(new DateTime(2013, 1, 2, 19, 29, 0, DateTimeKind.Unspecified), "XML, Unspecified"));

        ((IClientChannel)proxy).Close();
        factory.Close();

        factory = new ChannelFactory<ITest>(new WebHttpBinding(), new EndpointAddress(baseAddress + "/web"));
        factory.Endpoint.Behaviors.Add(new WebHttpBehavior());
        proxy = factory.CreateChannel();
        Console.WriteLine(proxy.Add10Hours(new DateTime(2013, 1, 2, 19, 29, 0, DateTimeKind.Utc), "JSON, UTC"));
        Console.WriteLine(proxy.Add10Hours(new DateTime(2013, 1, 2, 19, 29, 0, DateTimeKind.Local), "JSON, Local"));
        Console.WriteLine(proxy.Add10Hours(new DateTime(2013, 1, 2, 19, 29, 0, DateTimeKind.Unspecified), "JSON, Unspecified"));

        ((IClientChannel)proxy).Close();
        factory.Close();

        Console.Write("Press ENTER to close the host");
        Console.ReadLine();
        host.Close();
    }
}
于 2013-01-03T03:37:21.967 に答える