Json ASP.NET Web API:使用默认序列化程序

Json ASP.NET Web API:使用默认序列化程序,json,serialization,asp.net-web-api,signalr,Json,Serialization,Asp.net Web Api,Signalr,有没有一种简单的方法可以使用ASP.NET Web API的默认序列化程序 我的在WebApiConfig.cs中以这种方式配置 config.Formatters.JsonFormatter.SerializerSettings.Converters.Add(new StringEnumConverter()); config.Formatters.JsonFormatter.SerializerSettings.ContractResolver = new CamelCaseProperty

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

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

config.Formatters.JsonFormatter.SerializerSettings.Converters.Add(new StringEnumConverter());
config.Formatters.JsonFormatter.SerializerSettings.ContractResolver = new CamelCasePropertyNamesContractResolver();
它工作得很好。我想做的是在特定情况下手动使用相同的序列化程序。如果出于某种原因,配置发生了更改,则手动序列化必须反映这些更改,而不必关心这些更改


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

您可以在应用程序启动时使用自定义JSON.NET序列化程序设置向Signaler的依赖项解析程序注册自己的
IJsonSerializer

//...
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();

        //...

我根据这个bug报告找到了一个解决方案:

首先,创建自定义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为我指明了正确的方向

我找到了这个,它很好用

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

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

我不清楚这一部分:“在特定情况下手动使用完全相同的序列化程序”。根据以上详细信息,您正在全局格式化程序上进行设置。关于“向信号中心发送新资源”,您是如何做到的?(比如你使用httpclient,你是否在尝试使用json格式化程序)…很抱歉,有很多问题…不管怎样,如果有人发布资源,它都需要广播给每个需要实时更新的SignalR用户。此进程必须始终使用与Web API相同的序列化配置。确定。客户端1(发布资源)->服务(广播)->客户端2,客户端3,客户端n。在这个设置中,服务是一个webapi,具有上面提到的序列化程序设置。由于设置在全局格式化程序上,当资源广播到client2和client3时,它们应该使用相同的全局格式化程序设置…我的想法正确吗?这是一种非常有趣的方法。。。目前,如果我对这个块(不包括MapHubs)进行注释,它将以Pascal的形式输出数据。我一取消注释它,客户端就完全停止接收事件。我发现问题来自ContractResolver设置。只需注释这一行,系统就可以工作,但显然仍然在PascalCase中。在“assembly=typeof(Connection.assembly;”行中的连接是什么。我找不到