2015-08-24 6 views
2

У меня есть приложение для веб-api, в том числе некоторые функции SignalR, которые имеют свои зависимости, управляемые Autofac.SignalR, WebApi, Autofac, camelCasedJson

SignalR, из коробки, не поддерживает свойства camelCased Json.

Есть приличное исправление here, но мне нужно интегрировать его с Autofac.

Так .....

Вот SignalR HUB

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

Вот класс startup.cs inluding в Camelcased Разрешитель из статьи

[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), 
           } 
       } 
      }; 
     } 


    } 
} 

Я получаю camelCased свойства просто отлично со всем, что подается через WebApi, но не через Signalr.

ответ

1

Я предполагаю, что ваша проблема заключается в следующем:

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

Если вы используете Autofac в качестве распознавателя контейнера/зависимостей, вы хотите зарегистрировать сериалайзер с Autofac, а не скоро-to быть замененным глобальным преобразователем зависимостей.

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); 
    } 
} 
+0

Спасибо, может быть, за пару дней до того, как я рядом со своим компьютером, чтобы проверить результаты и отметить как правильно. Я знал, что это будет связано с глобальным хостом, просто не был уверен в синтаксисе регистрации этого сериализатора – MrBliz

+0

Это не работает для меня. Он регистрирует все в порядке, но сериализатор, похоже, испортил сообщение. Как только у меня есть сериализатор между ними, сообщения с хоста уже не делают его клиентам. @MrBliz вы можете поделиться ли вы это исправлено или нет? – Jasper

+0

Я этого не делал. Я закончил паскаль на клиенте – MrBliz

Смежные вопросы