3

次のようなモデルを受け入れる単純なハブがある SignalR に奇妙な問題があります。

public class Entry
{
    public string Version { get; set; }

    public Guid PersistedId
    {
        get { return Id; }
        set { Id = value; }
    }

    public Guid Id { get; set; }
    public Guid ParentId { get; set; }

    [Required]
    public string Content { get; set; }

    public DateTime DateCreated { get; set; }
    public Guid CreatorAccountId { get; set; }
}

次に、リクエストオブジェクトを調べます。サーバーに送信される投稿は次のとおりです。

{"H":"entryhub","M":"SendEntry","A":["{\"Version\":\"1.0.0\",\"PersistedId\":\"00000000-0000-0000-0000-000000000000\",\"ParentId\":\"1764a2e3-ff6f-4a17-9c5f-d99642301dbf\",\"Content\":\"test\",\"DateCreated\":\"2013-07-21T14:06:01.980Z\",\"CreatorAccountId\":\"00000000-0000-0000-0000-000000000000\"}"],"I":2}

私は例外を除いて応答を得続けます:

{"I":"2","E":"Error converting value \"{\"Version\":\"1.0.0\",\"PersistedId\":\"00000000-0000-0000-0000-000000000000\",\"ParentId\":\"1764a2e3-ff6f-4a17-9c5f-d99642301dbf\",\"Content\":\"test\",\"DateCreated\":\"2013-07-21T14:06:01.980Z\",\"CreatorAccountId\":\"00000000-0000-0000-0000-000000000000\"}\" to type 'SharedPlugin.Models.Entry'. Path '', line 1, position 266.","T":"   at Newtonsoft.Json.Serialization.JsonSerializerInternalReader.EnsureType(JsonReader reader, Object value, CultureInfo culture, JsonContract contract, Type targetType)\r\n   at Newtonsoft.Json.Serialization.JsonSerializerInternalReader.CreateValueInternal(JsonReader reader, Type objectType, JsonContract contract, JsonProperty member, JsonContainerContract containerContract, JsonProperty containerMember, Object existingValue)\r\n   at Newtonsoft.Json.Serialization.JsonSerializerInternalReader.Deserialize(JsonReader reader, Type objectType, Boolean checkAdditionalContent)\r\n   at Newtonsoft.Json.JsonSerializer.DeserializeInternal(JsonReader reader, Type objectType)\r\n   at Newtonsoft.Json.JsonSerializer.Deserialize(JsonReader reader, Type objectType)\r\n   at Newtonsoft.Json.JsonSerializer.Deserialize(TextReader reader, Type objectType)\r\n   at Microsoft.AspNet.SignalR.Json.JRawValue.ConvertTo(Type type)\r\n   at Microsoft.AspNet.SignalR.Hubs.DefaultParameterResolver.ResolveParameter(ParameterDescriptor descriptor, IJsonValue value)\r\n   at System.Linq.Enumerable.<ZipIterator>d__7a`3.MoveNext()\r\n   at System.Linq.Buffer`1..ctor(IEnumerable`1 source)\r\n   at System.Linq.Enumerable.ToArray[TSource](IEnumerable`1 source)\r\n   at Microsoft.AspNet.SignalR.Hubs.DefaultParameterResolver.ResolveMethodParameters(MethodDescriptor method, IList`1 values)\r\n   at Microsoft.AspNet.SignalR.Hubs.HubDispatcher.InvokeHubPipeline(IHub hub, IJsonValue[] parameterValues, MethodDescriptor methodDescriptor, HubRequest hubRequest, StateChangeTracker tracker)"}

Json.net の基になるシリアル化に問題があるのではないかと思いましたが、ポスト リクエストからまったく同じ json 文字列を取得し、それを Entry オブジェクトに逆シリアル化する単体テストを作成しました。正常に動作します。

オンラインで確認しましたが、エラーに関する情報はあまりないようです。日付である可能性があると思いますが、独自の JsonNetSerializer を設定し、日付、null、メンバーの欠落などを処理する方法を変更しようとしましたが、何も役に立たないようで、単体テストではデフォルト以外の設定はありません正常に動作するため、これは Json.net の問題ではないことを意味します。

4

1 に答える 1

0

問題が見つかりました。ko.toJS ではなくオブジェクトで ko.toJSON を呼び出していたため、二重のシリアル化が原因でした。

ko.toJSON — ビュー モデルのデータを表す JSON 文字列を生成します。内部的には、ビュー モデルで ko.toJS を呼び出すだけで、結果に対してブラウザーのネイティブ > JSON シリアライザーを使用します。注: ネイティブの JSON > シリアライザー (IE 7 以前など) を持たない古いブラウザーでこれを機能させるには、json2.js ライブラリーも参照する必要があります。

ko.toJS — これは、ビュー モデルのオブジェクト グラフのクローンを作成し、各オブザーバブルをそのオブザーバブルの現在の値に置き換えます。そのため、データのみを含み、ノックアウト関連のアーティファクトを含まないプレーン コピーを取得します。

dfowler と話した後で初めて、これが事実であり、要求データが json を期待どおりの完全な json オブジェクトではなく、単一の文字列として示していることに気付きました。だから二重連載しないで!

于 2013-07-21T18:06:52.713 に答える