web-dev-qa-db-ja.com

JQueryJSONをWCFに送信REST日付を使用

WCF REST JQuery/JSONを介して消費することについての投稿がたくさんあることは知っていますが、それを機能させることができません。現在、日付パラメーターでスタックしています。以下は私のC#メソッド:

[OperationContract]
[WebInvoke]
[TransactionFlow(TransactionFlowOption.Allowed)]
string GoodRegister(DateTime pDtTimeStampTransac, Int32 pIDResource, Decimal pQty, enQtyLogType pQtyGoodLogType);

以下は私のJavaScriptコードです:

/// <reference path="../Scripts/jquery-1.4.1-vsdoc.js" />
/// <reference path="json.js" />

Date.prototype.toMSJSON = function () {
  var date = '\\\/Date(' + this.getTime() + ')\\\/';
  return date;
};

function botaoclick() {
  var date = new Date().toMSJSON();
  var datavar = {
    'pDtTimeStampTransac': date,
    'pIDResource': 1,
    'pQty': 1
  };
  $.ajax(
  {
    type: "POST",
    contentType: "application/json; charset=utf-8",
    url: "http://desk01:9876/ShopFloorService/script/GoodRegister",
    dataType: "json",
    data: JSON.stringify(datavar),
    //data: '{"pDtTimeStampTransac":date, "pIDResource":"teste", "pQty":"3"}',
    error: jqueryError,
    success: function (msg) {
      alert("back");
      var divForResult = document.getElementById("test");
      divForResult.innerHTML = "Result: <b>" + msg.d + "</b>";
    }
  }
  )
}

function jqueryError(request, status, error) {
  alert(request.responseText + " " + status + " " + error);
}

私の最初の問題は、日付のシリアル化エラーが発生し続けることです。

{"ExceptionDetail":{"HelpLink":null,"InnerException":{"HelpLink":null,"InnerException":{"HelpLink":null,"InnerException":null,"Message":"DateTime content '\\\/Date(1292616078638)\\\/' does not start with '\\\/Date(' and end with ')\\\/' as required for JSON.","StackTrace":"   at System.Runtime.Serialization.Json.JsonReaderDelegator.ParseJsonDate(String originalDateTimeValue)\u000d\u000a   at 

開始と終了の方法で開始/終了しないと表示されます。

私の2番目の質問は、列挙子に乗る必要がありますか、それとも送信する方法はありますか?

18
Pascal

私はたくさんの髪を抜いて、これにたくさんの涙を流しましたが、これはうまくいきました。 toMSJSON関数の日付形式を変更しました。 WCFは、 Rick Strahl のおかげで私が実現したこの形式を受け入れます。

Date.prototype.toMSJSON = function () {
    var date = '/Date(' + this.getTime() + ')/'; //CHANGED LINE
    return date;
};

また、日付をUTC時間に変換する必要があります。そうしないと、あらゆる種類の面白いものが得られます。

  var dt = ...;
  var dt1 = new Date(Date.UTC(dt.getFullYear(), dt.getMonth(), dt.getDate(),   dt.getHours(), dt.getMinutes(), dt.getSeconds(), dt.getMilliseconds()));
  var wcfDateStr = dt1.toMSJSON();

お役に立てれば。

44
Vas

によると: http://msdn.Microsoft.com/en-us/library/bb412170.aspx

日時ワイヤーフォーマット

DateTime値は、「/ Date(700000 + 0500)/」の形式でJSON文字列として表示されます。最初の数値(提供されている例では700000)は、GMTタイムゾーンのミリ秒数であり、通常(夏時間以外)です。 1970年1月1日の深夜からの時間。数値は、それ以前の時間を表すために負の値になる場合があります。例の「+0500」で構成される部分はオプションであり、時刻がローカルの種類であることを示します。つまり、逆シリアル化時にローカルタイムゾーンに変換する必要があります。存在しない場合、時刻はUTCとして逆シリアル化されます。実際の数(この例では「0500」)とその符号(+または-)は無視されます。

DateTimeをシリアル化する場合、ローカル時間と不特定時間はオフセット付きで書き込まれ、UTCはオフセットなしで書き込まれます。

ASP.NET AJAXクライアントJavaScriptコードは、そのような文字列をJavaScript DateTimeインスタンスに自動的に変換します。NETでDateTime型ではない同様の形式の他の文字列がある場合、それらは次のように変換されます。上手。

変換は、「/」文字がエスケープされている場合にのみ行われます(つまり、JSONは「\/Date(700000 + 0500)\ /」のようになります)。このため、WCFのJSONエンコーダー(WebHttpBindingで有効)は常にエスケープされます。キャラクター。

列挙子は問題ないはずです。

2
Stever B

上記の@vasによる答えを構築する:-

// OrderRecievedDateTime is a proper date string
var tStart = new Date(OrderRecievedDateTime);
// Get date in UTC (required for WCF) as morning
var start = new Date(Date.UTC(tStart.getFullYear(), tStart.getMonth(), tStart.getDate(), 0, 0, 0));
// Get the ticks
var startTicks = start.getTime();

// Now build the JSON param (**notice I am passing the date value as a string, by including within quotes. Without this it doesn't takes it**).
var paramRequest = '{ "request": { "StartDate":"' + '\/Date(' + startTicks  + ')\/"'  + ' } }';

// Hit ajax, no need of any JSON.parse or stringify
$.ajax({ ..., data = paramRequest ..});

WCFは、適切な形式で日付を受け取ります。重要な追加は、JSONで日付を文字列として渡す方法です。キーと/ Date文字列の開始を組み合わせることにより、次のようにさらに簡略化できます

var paramRequest = '{ "request": { "StartDate":"\/Date(' + startTicks  + ')\/" } }';
0
NitinSingh

AlsalaamAleykum。

あなたがしなければならないのはエラーに応答することです。つまり、日付形式を変更して、jsonがそれをWebサービスに解析できるようにします。

コードは次のようになります。

       function botaoclick() {

         var date = new Date();
         date = "\/Date(" + date.valueOf() + ")\/";
         // valueOf() method Returns the primitive value of a Date object.

         var datavar = {
           'pDtTimeStampTransac': date,
           'pIDResource': 1,
           'pQty': 1
         };

         $.ajax({
           type: "POST",
           contentType: "application/json; charset=utf-8",
           url: "YOUR URL",
           dataType: "json",
           data: JSON.stringify(datavar),
           error: jqueryError,
           success: function(msg) {
             alert("back");
             var divForResult = document.getElementById("test");
             divForResult.innerHTML = "Result: <b>" + msg.d + "</b>";
           }
         })
       }

       function jqueryError(request, status, error) {
         alert(request.responseText + " " + status + " " + error);
       }
0
Student

これは、JSON.stringify()を使用してクライアントに配置する この投稿 (変更)からのほとんど見かけのない解決策です:

jsonData = JSON.stringify([new Date()], 
    function (k, v) { return this[k] instanceof Date ? '/Date(' + v + ')/' : v; });

これは私にとって最新のIE、Chrome、Firefoxで動作します。

列挙型を変換するためのヒントについては、JSON.stringify(ネイティブメソッド)とreplacerパラメーターを確認してください。

0
Jason Kleban

Wcfに渡す前に、日付を適切にフォーマットする一般的な方法が必要です。

メソッドは次のようになります。

var dateToWcf = function(input)
{
    var d = new Date(input); 
    if (isNaN(d)) return null;     
    var formattedDate = { date : "/Date(" + d.getTime() + ")/" };
    return formattedDate;
}

ただし、投稿すると、投稿元の実際のタイムゾーンに基づいてオフセット値が追加されるため、これを回避するために、それに応じてオフセットを調整できます。

var formattedDate = { date: "/Date(" + d.getTime() + d.getGMTOffset() + ")/" };
0