2016-04-24 6 views
3

Dictionary<long, List<SpecialParam>>オブジェクトを公開してサブスクリプション要求に応答するハブを持つWebAPIサーバーがあります。SignalRによって抽象クラスとして渡されたオブジェクトを逆シリアル化します

SpecialParamのリストは、両方がSpecialParamを継承タイプSpecialParamA & SpecialParamBの項目が含まれています。

私は、クライアント上で公開キャプチャしよう:

hubProxy.On<Dictionary<long, List<SpecialParam>>>(hubMethod, res => 
{ 
    DoStuff(); 
}); 

DoStuff()メソッドが呼び出されません。公開戻り値をstringに変更し、string値を受け取るようにプロキシを変更すると、DoStuff()メソッドが呼び出されます。したがって、問題は、SpecialParamアイテムの逆シリアル化にあります。

私は、サーバー側で設定しようとした:

var serializer = JsonSerializer.Create(); 
serializer.TypeNameHandling = TypeNameHandling.All; 
var hubConfig = new HubConfiguration(); 
hubConfig.Resolver.Register(typeof(JsonSerializer),() => serializer); 
GlobalHost.DependencyResolver.Register(typeof(JsonSerializer),() => serializer); 

しかし、それは助けにはなりませんでした。

私はまた、クライアントに追加してみました:

HubConnection hubConnection = new HubConnection(hubPath); 
hubConnection.JsonSerializer.TypeNameHandling = Newtonsoft.Json.TypeNameHandling.Auto; 
hubProxy = hubConnection.CreateHubProxy(hubName); 
hubProxy.JsonSerializer.TypeNameHandling = Newtonsoft.Json.TypeNameHandling.Auto; 

そしてそれはまた助けにはなりませんでした。

他の解決策では、人々は新しいIParameterResolverを定義しましたが、出力がハブから公開されたときではなく、サーバーがハブメソッドへの入力を受け取ったときにのみ呼び出されます。

助けてください!ここで

UPDATE

は、私はフィドラーでキャッチです:

{"$type":"Microsoft.AspNet.SignalR.Hubs.HubResponse, Microsoft.AspNet.SignalR.Core","I":"0"} 

これは、サーバがクライアントに応答するものです。

UPDATE 2

私はまだ、すでにDictionary<long, List<SpecialParam>>としてデシリアライズさ、それを受信する方法を把握しようとしています。

public static void ConfigureApp(IAppBuilder appBuilder) 
{ 
    ... 
    var service = (JsonSerializer)GlobalHost.DependencyResolver.GetService(typeof(Newtonsoft.Json.JsonSerializer)); 
    service.TypeNameHandling = TypeNameHandling.All; 
    ... 
} 

とクライアントで期待されるタイプの除去:

hubProxy.On(hubMethod, res => 
{ 
    DoStuff(); 
}); 

私はJSON形式の応答を取得し、私はそれをデシリアライズ:

答えて

1

は私がサービスに設定することで、それを解決し

var serializer = new JsonSerializer(); 
serializer.TypeNameHandling = TypeNameHandling.All; 
JObject jObject = resp as JObject; 
var specialParams = jObject.ToObject<Dictionary<long, List<SpecialParam>>>(serializer); 

私のクライアントが既にデシリアライズされた状態にする方法はまだ分かりません。

関連する問題