0

有没有一种简单的方法来使用 ASP.NET Web API 的默认序列化程序?

我的在 WebApiConfig.cs 中以这种方式配置

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

它完美地工作。我想做的是在特定情况下手动使用相同的序列化程序。如果由于某种原因配置更改,手动序列化必须反映这些更改,而不必关心它。

为了更准确地说明我的意图,我想在将新资源保​​存到数据库后立即将它们发送到 SignalR Hub。它们需要以与使用 GET 请求时 ASP.NET Web API 相同的方式进行序列化。

4

3 回答 3

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 回答
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

我发现了这个,它工作正常

var formatter = GlobalConfiguration.Configuration.Formatters.JsonFormatter;
formatter.SerializerSettings = new JsonSerializerSettings
{
    Formatting = Formatting.Indented,
    TypeNameHandling = TypeNameHandling.Objects,
    ContractResolver = new CamelCasePropertyNamesContractResolver()
};

这必须放在“Application_Start”函数的“Global.asax.cs”文件中

于 2017-08-18T08:51:48.580 回答