SignalR Typenamehandling
Я пытаюсь заставить SignalR работать с пользовательскими JsonSerializerSettings для его полезной нагрузки, в частности, я пытаюсь установитьTypeNameHandling = TypeNameHandling.Auto
.
Проблема заключается в том, что SignalR использует настройки вhubConnection.JsonSerializer
а такжеGlobalHost.DependencyResolver.Resolve<JsonSerializer>()
для его внутренних структур данных, который затем вызывает все виды хаоса (внутренний сервер падает, когда я устанавливаюTypeNameHandling.All
как самый грубый пример, но сTypeNameHandling.Auto
У меня тоже проблемы, особенно когдаIProgress<>
обратные вызовы участвуют).
Есть ли обходной путь или я просто делаю это неправильно?
Пример кода для демонстрации:
Сервер:
class Program
{
static void Main(string[] args)
{
using (WebApp.Start("http://localhost:8080"))
{
Console.ReadLine();
}
}
}
public class Startup
{
public void Configuration(IAppBuilder app)
{
var hubConfig = new HubConfiguration()
{
EnableDetailedErrors = true
};
GlobalHost.DependencyResolver.Register(typeof(JsonSerializer), ConverterSettings.GetSerializer);
app.MapSignalR(hubConfig);
}
}
public interface IFoo
{
string Val { get; set; }
}
public class Foo : IFoo
{
public string Val { get; set; }
}
public class MyHub : Hub
{
public IFoo Send()
{
return new Foo { Val = "Hello World" };
}
}
Клиент:
class Program
{
static void Main(string[] args)
{
Task.Run(async () => await Start()).Wait();
}
public static async Task Start()
{
var hubConnection = new HubConnection("http://localhost:8080");
hubConnection.JsonSerializer = ConverterSettings.GetSerializer();
var proxy = hubConnection.CreateHubProxy("MyHub");
await hubConnection.Start();
var result = await proxy.Invoke<IFoo>("Send");
Console.WriteLine(result.GetType());
}
Общий:
public static class ConverterSettings
{
public static JsonSerializer GetSerializer()
{
return JsonSerializer.Create(new JsonSerializerSettings()
{
TypeNameHandling = TypeNameHandling.All
});
}
}