3

「タイムスタンプ」のリストを取得するWCFメソッドがあります

public bool SyncTimestamps(IList<Timestamp> timestamps)

私の人生では、クライアントがRestSharpを使用して満足している形式で値をホストに渡すことはできません。問題は日付のフォーマットにあるようです。

試行 1

var request = new RestRequest("Timestamp/SyncTimestamps", Method.POST);
request.RequestFormat = DataFormat.Json;
request.AddBody(timestamps);

出力 1

"[{\"ID\":1,\"JobId\":654321,\"TimestampSelected\":\"2013-08-05T13:51:13.6201529Z\",\"TimestampActual\":\"2013-08-05T13:51:13.6201529Z\",\"Type\":1,\"Active\":false}]"

エラー 1

DateTime コンテンツ '2013-08-05T13:51:13.6201529Z' は、JSON に必要な '/Date(' で始まり、')/' で終わるものではありません。

これは RestSharp シリアライザーの問題であると読んだので、わずかに異なる日付文字列を生成する Json.Net に置き換えました。

試行 2

var request = new RestRequest("Timestamp/SyncTimestamps", Method.POST);
request.RequestFormat = DataFormat.Json;
request.AddBody(JsonConvert.SerializeObject(timestamps));    

アウトプット 2

{application/json="[{\"ID\":1,\"JobId\":654321,\"TimestampSelected\":\"2013-08-05T14:54:33.9261815+01:00\",\"TimestampActual\":\"2013-08-05T14:54:33.9251814+01:00\",\"Type\":1,\"Active\":false}]"}

エラー 2

The exception message is 'Expecting state 'Element'.. 
Encountered 'Text' with name '', namespace ''. '. See server logs for more details. 
The exception stack trace is: 

at ReadArrayOfTimestampFromJson(XmlReaderDelegator , XmlObjectSerializerReadContextComplexJson , XmlDictionaryString , XmlDictionaryString , CollectionDataContract ) 
at System.Runtime.Serialization.Json.JsonCollectionDataContract.ReadJsonValueCore(XmlReaderDelegator jsonReader, XmlObjectSerializerReadContextComplexJson context) 
at System.Runtime.Serialization.Json.JsonDataContract.ReadJsonValue(XmlReaderDelegator jsonReader, XmlObjectSerializerReadContextComplexJson context) at 

WCFサービスが喜んで受け入れて逆シリアル化する日付形式を生成する方法を誰かが提案できますか? MSDN のドキュメントには、次の形式が必要であると記載されています。

DateTime 値は、"/Date(700000+0500)/" の形式の JSON 文字列として表示されます。ここで、最初の数値 (提供されている例では 700000) は、GMT タイム ゾーン、通常 (非夏時間) のミリ秒数です。 1970 年 1 月 1 日午前 0 時からの時間。

アップデート :

JSON.Net の一部として、WCF が要求しているように見える形式に日付を転送できる設定を見つけました。

var settings = new JsonSerializerSettings() { DateFormatHandling = DateFormatHandling.MicrosoftDateFormat };
JsonConvert.SerializeObject(obj, settings);

これにより、シリアル化された文字列の作成が完了したようです。

{application/json="[{\"ID\":1,\"JobId\":654321,\"TimestampSelected\":\"\\/Date(1375713542908+0100)\\/\",\"TimestampActual\":\"\\/Date(1375713542908+0100)\\/\",\"Type\":1,\"Active\":false}]"}

ただし、私のサービスはこれを「例外メッセージは 'Expecting state 'Element'..」 で拒否します。

4

2 に答える 2