【问题标题】:SignalR, WebApi, Autofac, camelCasedJsonSignalR、WebApi、Autofac、camelCasedJson
【发布时间】:2015-08-25 23:25:50
【问题描述】:

我有一个 web api 应用程序,包括一些 SignalR 功能,它的依赖项由 Autofac 管理。

开箱即用的SignalR不支持camelCased Json属性。

有一个不错的修复 here,但我需要将它与 Autofac 集成。

所以.....

这是 SignalR 集线器

 public class PledgeHub : Hub
{
    public void SendPledge(LivePledgeUpdate pledge)
    {
        Clients.All.sendPledge(pledge);
    }
}

这是包含文章中的 Camelcased Resolver 的 startup.cs 类

[assembly: OwinStartup(typeof(Startup))]
namespace Filanthropy.Web
{
    public partial class Startup
    {

        private readonly HttpConfiguration config;

        public Startup()
        {
            config = new HttpConfiguration();
        }

        public void Configuration(IAppBuilder app)
        {

            // Set the dependency resolver to be Autofac.
            var container = BuildContainer(config);

            config.DependencyResolver = new AutofacWebApiDependencyResolver(container);

            ConfigureAuth(app);

            ConfigureWebApi(config);

            app.MapSignalR();          

            app.UseWebApi(config);

            app.UseAutofacMiddleware(container);
            app.UseAutofacWebApi(config);            
    }



        private void ConfigureWebApi(HttpConfiguration config)
        {
            config.MapHttpAttributeRoutes();

            config.Routes.MapHttpRoute(
               name: "DefaultApi",
               routeTemplate: "api/{controller}/{id}",
               defaults: new { id = RouteParameter.Optional }
               );

            var jsonFormatter = config.Formatters.OfType<JsonMediaTypeFormatter>().First();
            jsonFormatter.SerializerSettings.ContractResolver = new CamelCasePropertyNamesContractResolver();


        }

        private static IContainer BuildContainer(HttpConfiguration config)
        {
           var builder = new ContainerBuilder();

            // Register your Web API controllers.
            builder.RegisterApiControllers(Assembly.GetExecutingAssembly());

            // OPTIONAL: Register the Autofac filter provider.
            builder.RegisterWebApiFilterProvider(config);

            builder.RegisterType<PledgeHub>().ExternallyOwned();           

            GlobalHost.DependencyResolver.Register(typeof(JsonSerializer), () => JsonSerializerFactory.Value);

            return builder.Build();
    }


        private static readonly Lazy<JsonSerializer> JsonSerializerFactory = new Lazy<JsonSerializer>(GetJsonSerializer);

        private static JsonSerializer GetJsonSerializer()
        {
            return new JsonSerializer
            {
                ContractResolver = new FilteredCamelCasePropertyNamesContractResolver
                {

                    TypesToInclude =
                                {
                                    typeof(SignalRHubs.PledgeHub),
                                }
                }
            };
        }


    }
}

对于通过 WebApi 提供的所有内容,但不是通过 Signalr 提供的所有内容,我都可以使用 camelCased 属性。

【问题讨论】:

    标签: json asp.net-web-api signalr autofac


    【解决方案1】:

    我猜你的问题是这样的:

    GlobalHost.DependencyResolver.Register(typeof(JsonSerializer), () => JsonSerializerFactory.Value);
    

    如果您使用 Autofac 作为容器/依赖解析器,您希望将序列化程序注册到 Autofac,而不是使用即将被替换的全局依赖解析器。

    builder.Register(ctx => JsonSerializerFactory.Value).As<JsonSerializer>();
    

    另外,我看到您正在使用 OWIN。当您使用 OWIN 时,您不会引用 GlobalHost - 您单独设置集线器配置。 The docs have an example showing how to do it:

    public class Startup
    {
      public void Configuration(IAppBuilder app)
      {
        var builder = new ContainerBuilder();
    
        // STANDARD SIGNALR SETUP:
    
        // Get your HubConfiguration. In OWIN, you'll create one
        // rather than using GlobalHost.
        var config = new HubConfiguration();
    
        // Register your SignalR hubs.
        builder.RegisterHubs(Assembly.GetExecutingAssembly());
    
        // Set the dependency resolver to be Autofac.
        var container = builder.Build();
        config.Resolver = new AutofacDependencyResolver(container);
    
        // OWIN SIGNALR SETUP:
    
        // Register the Autofac middleware FIRST, then the standard SignalR middleware.
        app.UseAutofacMiddleware(container);
        app.MapSignalR("/signalr", config);
      }
    }
    

    【讨论】:

    • 谢谢,我可能要过几天才能靠近我的电脑检查结果并标记为正确。我知道这与全局主机有关,只是不确定注册该序列化程序的语法
    • 这对我不起作用。它注册得很好,但是序列化器似乎弄乱了通信。一旦我在两者之间安装了序列化程序,来自主机的消息就不会再发送给客户端了。 @MrBliz 你能分享一下你是否解决了这个问题吗?
    • 我没有。我最终在客户端上使用了帕斯卡套管
    猜你喜欢
    • 2019-02-09
    • 2020-04-18
    • 1970-01-01
    • 2015-06-29
    • 1970-01-01
    • 1970-01-01
    • 2023-04-05
    • 2018-05-22
    • 1970-01-01
    相关资源
    最近更新 更多