2016-06-15 6 views
5

.NET Core RC2を使用しています。 SignalRが動作しましたが、JSONのcamelCaseプロパティを返すようにしようとしています。SignalR .NET Core CamelCase JSON契約解決者

私が使用しているAPIの

...

services.AddMvc().AddJsonOptions(o => { 
    o.SerializerSettings.ContractResolver = new CamelCasePropertyNamesContractResolver(); 
}); 

たぶんSignalRのためにまだ場所でちょうど何も(結局、でも...まだ動作するようになっていない)、しかし、誰もが考え出しています迷っている場合がありませんそれはまだですか?私はいくつかのことを試しました...

services.AddTransient<IContractResolver, CamelCasePropertyNamesContractResolver>(); 

...しかし、行っていません。

誰もが、これはまだ働いて得ましたか。

+2

これらの質問と回答は.net 4.5/4.6ではなく、コアです。 – PersonThing

答えて

11

SignalRコアリポジトリのthis issueに基づいて、今のところこれを行う方法はありませんが、this comment on an old SignalR issueのようにカスタムコントラクトリゾルバを作成できます。

そのスレッドがSignalR 2.2.0用ですので、のは、それがSignalRコアのために働くにしましょう。ここでは何が起こる

using System; 
using System.Reflection; 
using Microsoft.AspNetCore.SignalR.Infrastructure; 
using Newtonsoft.Json.Serialization; 

    public class SignalRContractResolver : IContractResolver 
    { 
     private readonly Assembly _assembly; 
     private readonly IContractResolver _camelCaseContractResolver; 
     private readonly IContractResolver _defaultContractSerializer; 

     public SignalRContractResolver() 
     { 
      _defaultContractSerializer = new DefaultContractResolver(); 
      _camelCaseContractResolver = new CamelCasePropertyNamesContractResolver(); 
      _assembly = typeof(Connection).GetTypeInfo().Assembly; 
     } 


     public JsonContract ResolveContract(Type type) 
     { 
      if (type.GetTypeInfo().Assembly.Equals(_assembly)) 
       return _defaultContractSerializer.ResolveContract(type); 

      return _camelCaseContractResolver.ResolveContract(type); 
     } 

    } 

は、クライアントとの通信を壊すので、あなたは、SignalRの内部のためのキャメルケース契約リゾルバを使用することができないということです。

ResolveContractメソッドで契約を解決するたびに、現在解決されているタイプのアセンブリをチェックして、それがSignalR internalであることを確認する必要があります。もしそうでなければ、私たちはラクダのケースを使って契約を解決することができます。この時点で

は、我々は枠組みの中で、この契約リゾルバを登録する必要があります。

public void ConfigureServices(IServiceCollection services) 
    { 
     var settings = new JsonSerializerSettings(); 
     settings.ContractResolver = new SignalRContractResolver(); 

     var serializer = JsonSerializer.Create(settings); 

     services.Add(new ServiceDescriptor(typeof(JsonSerializer), 
              provider => serializer, 
              ServiceLifetime.Transient)); 

     // register other services like SignalR, MVC and custom services 
    } 

+0

まさに私が探していたもので、素晴らしい作品です。ありがとうございました! – PersonThing

+4

素晴らしい、ありがとう。私は登録を1つのライナーに煮詰めました: 'services.AddSingleton(_ => new JsonSerializer {ContractResolver = new SignalRContractResolver()});'(シングルトンと一緒に)。 – Stajs

4

signalRコア(1.0.0 - アルファ - 最終)の最初の最終アルファリリースのように、あなたは、以下のネイティブコードスニペットのようなキャメルケースを得ることができる:

services.AddSignalR(option => 
{ 
    option.JsonSerializerSettings.ContractResolver = new CamelCasePropertyNamesContractResolver(); 
}); 

実際には、あなたも使用することができますCamelCasePropertyNamesContractResolverの代わりにカスタマイズされたリゾルバ。

+0

アップデートありがとう、Arash。知っておいてよかった。私はしばらくの間、SignalRを使用していましたが、Azureがproject.jsonのサポートを打ち切った後、代わりに簡単な.netコアwebsocketサーバーを実装しました。私は公式の.netコアSignalRがカスタム実装を維持する必要性を避けるためにリリースされたときにSignalRに切り替えるかもしれませんが、今のところうまくいきます。 – PersonThing

関連する問題