0

ASP.NET Web API の既定のシリアライザーを使用する簡単な方法はありますか?

私は WebApiConfig.cs でそのように構成されています

config.Formatters.JsonFormatter.SerializerSettings.Converters.Add(new StringEnumConverter());
config.Formatters.JsonFormatter.SerializerSettings.ContractResolver = new CamelCasePropertyNamesContractResolver();

それは完全に機能します。私がやりたいのは、特定の状況で手動でまったく同じシリアライザーを使用することです。何らかの理由で構成が変更された場合、手動のシリアライゼーションはそれらの変更を気にせずに反映する必要があります。

私の意図をより正確に言うと、新しいリソースをデータベースに保存した直後に SignalR Hub に送信したいと考えています。ASP.NET Web API が GET 要求を使用する場合とまったく同じ方法でシリアル化する必要があります。

4

3 に答える 3

0

このバグレポートに基づく解決策を見つけました: https://github.com/SignalR/SignalR/issues/500

まず、カスタム IContractResolver を作成します

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).Assembly;
    }

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

        return _camelCaseContractResolver.ResolveContract(type);
    }
}

次にApplicationStartに登録します

    var settings = new JsonSerializerSettings();
    settings.Converters.Add(new StringEnumConverter());
    settings.ContractResolver = new SignalRContractResolver();

    var serializer = new JsonNetSerializer(settings);

    GlobalHost.DependencyResolver.Register(typeof(IJsonSerializer), () => serializer);

私を正しい方向に向けてくれたhalter73に感謝します!

于 2013-03-28T19:04:22.367 に答える
0

IJsonSerializerカスタムの JSON.NET シリアライザー設定を使用して、アプリケーションの開始時に SignalR の依存関係リゾルバーに独自のものを登録できます。

//...
using Microsoft.AspNet.SignalR.Json;
using Newtonsoft.Json;

//...

    protected void Application_Start(object sender, EventArgs e)
    {

        var settings = new JsonSerializerSettings();
        settings.Converters.Add(new StringEnumConverter());
        settings.ContractResolver = new CamelCasePropertyNamesContractResolver();

        var serializer = new JsonNetSerializer(settings);

        GlobalHost.DependencyResolver.Register(typeof(IJsonSerializer), () => serializer);

        RouteTable.Routes.MapHubs();

        //...
于 2013-03-28T17:56:59.380 に答える