6

オブジェクトのプロパティをTDateTimeからStringに変更することが最も提案される解決策であることはわかっていますが、Webサービスアプリケーションのすべてのソースコードにアクセスできないため、それができない場合があります。だから私はむしろ私が問題の世話をすることを確実にしたいのです。

簡単に言うと、Delphi 2005で記述されたサービスアプリケーションのWebメソッドを呼び出して、開始日時と終了日時を含む予定オブジェクトを取得する.NETMVCアプリケーションがあります。ユーザーは予定に変更を加えることができ、MVCアプリは別のWebメソッドを呼び出して、変更された予定オブジェクトを渡し、サービスアプリケーションに保存します。

TAppointemntのStartTimeプロパティとEndTimeプロパティは、DelphiではTDateTimeとして定義されています。それらはWSDLにxs:dateTimeとして表示されます。Visual Studioは、それらをReference.csにSystem.DateTimeとして作成します。

DelphiでWebAppDebuggerを使用し、MVCアプリのエンドポイントをWebサービスEXEに設定することで、両方のアプリケーションをリアルタイムでステップスルーできます。私が見ているのは、送受信されたAppointmentオブジェクトのStartTimeプロパティとEndTimeプロパティは、Webサービスから.NET MVCに渡されるときは同じですが、.NETMVCからDelphiに渡されるときは13時間調整されます。ウェブサービス。

.NETがいくつかの内部タイムゾーン調整を行うことは理解していますが、それはクライアントとサーバーが異なるタイムゾーンにある場合にのみ明らかになるはずです。私の場合、クライアントブラウザー、.NET MVCアプリ、およびDelphiサービスアプリは同じものにあります。実際、それらはすべて同じマシンで実行されているので、なぜ違いがあるのか​​途方に暮れています。

XMLで日時を異なる方法でエンコードしているように見えます...

Delphiサービスアプリから.NETMVCアプリへの応答:

<StartTime xsi:type="xsd:dateTime">2012-10-29T08:00:00.000+13:00</StartTime><EndTime xsi:type="xsd:dateTime">2012-10-29T09:15:00.000+13:00</EndTime>

.NET MVCアプリからDelphiサービスアプリへのPOST:

<StartTime xsi:type="xsd:dateTime">2012-10-29T08:00:00</StartTime><EndTime xsi:type="xsd:dateTime">2012-10-29T09:15:00</EndTime>
4

1 に答える 1

6

私は自分に合った解決策を見つけました。

アポイントメントの更新を処理するモデルでは、ビューコンポーネントによって生成されたアポイントメントオブジェクトが渡されますが、これにはすべてのプロパティが含まれているわけではありません。ビューにあるものだけ。アポイントメントを完了するために、サービスアプリケーションから変更されていないバージョンを取得し、新しいオブジェクトに基づいてそのプロパティを変更します。

デバッグ時に私が見つけたのは、サービスアプリケーションから取得したwsAppointmentのStartTimeプロパティとEndTimeプロパティのDateTimeKindがLocalであり、pAppointmentパラメーターのStartTimeプロパティとEndTimeが未指定に設定されていることです。そのため、サービスアプリに返していたLocal DateTimeKindは、Unspecificedで上書きされていました。

これを修正するために、次のように、DateTime.SpecifyKindを使用してKindプロパティを明示的に設定しました。

wsAppointment.StartTime = DateTime.SpecifyKind(pAppointment.StartTime, DateTimeKind.Local);
wsAppointment.EndTime = DateTime.SpecifyKind(pAppointment.EndTime, DateTimeKind.Local);

これが同じまたは同様の問題を経験している他の人を助けることを願っています。

于 2012-11-30T04:58:05.773 に答える