diff --git a/samples/ChatSample/Views/Home/Index.cshtml b/samples/ChatSample/Views/Home/Index.cshtml
index 5e45c8fcf6..d16f51d417 100644
--- a/samples/ChatSample/Views/Home/Index.cshtml
+++ b/samples/ChatSample/Views/Home/Index.cshtml
@@ -35,15 +35,15 @@ connection.on('SetUsersOnline', usersOnline => {
connection.on('UsersJoined', users => {
users.forEach(user => {
- appendLine('User ' + user.Name + ' joined the chat');
+ appendLine('User ' + user.name + ' joined the chat');
addUserOnline(user);
});
});
connection.on('UsersLeft', users => {
users.forEach(user => {
- appendLine('User ' + user.Name + ' left the chat');
- document.getElementById(user.ConnectionId).outerHTML = '';
+ appendLine('User ' + user.name + ' left the chat');
+ document.getElementById(user.connectionId).outerHTML = '';
});
});
@@ -78,12 +78,12 @@ function appendLine(line, color) {
};
function addUserOnline(user) {
- if (document.getElementById(user.ConnectionId)) {
+ if (document.getElementById(user.connectionId)) {
return;
}
var userLi = document.createElement('li');
- userLi.innerText = `${user.Name} (${user.ConnectionId})`;
- userLi.id = user.ConnectionId;
+ userLi.innerText = `${user.name} (${user.connectionId})`;
+ userLi.id = user.connectionId;
document.getElementById('users').appendChild(userLi);
}
diff --git a/src/Microsoft.AspNetCore.SignalR.Client.Core/HubConnectionBuilder.cs b/src/Microsoft.AspNetCore.SignalR.Client.Core/HubConnectionBuilder.cs
index 2dca887414..81fb12c56b 100644
--- a/src/Microsoft.AspNetCore.SignalR.Client.Core/HubConnectionBuilder.cs
+++ b/src/Microsoft.AspNetCore.SignalR.Client.Core/HubConnectionBuilder.cs
@@ -46,7 +46,7 @@ namespace Microsoft.AspNetCore.SignalR.Client
var loggerFactory = ((IHubConnectionBuilder)this).GetLoggerFactory();
var hubProtocol = ((IHubConnectionBuilder)this).GetHubProtocol();
- return new HubConnection(connection, hubProtocol ?? new JsonHubProtocol(new JsonSerializer()), loggerFactory);
+ return new HubConnection(connection, hubProtocol ?? new JsonHubProtocol(), loggerFactory);
}
[EditorBrowsable(EditorBrowsableState.Never)]
diff --git a/src/Microsoft.AspNetCore.SignalR.Client.Core/HubConnectionBuilderExtensions.cs b/src/Microsoft.AspNetCore.SignalR.Client.Core/HubConnectionBuilderExtensions.cs
index a6b770d6cc..e678c97349 100644
--- a/src/Microsoft.AspNetCore.SignalR.Client.Core/HubConnectionBuilderExtensions.cs
+++ b/src/Microsoft.AspNetCore.SignalR.Client.Core/HubConnectionBuilderExtensions.cs
@@ -4,6 +4,7 @@
using System;
using Microsoft.AspNetCore.SignalR.Internal.Protocol;
using Microsoft.Extensions.Logging;
+using MsgPack.Serialization;
using Newtonsoft.Json;
namespace Microsoft.AspNetCore.SignalR.Client
@@ -18,7 +19,17 @@ namespace Microsoft.AspNetCore.SignalR.Client
public static IHubConnectionBuilder WithJsonProtocol(this IHubConnectionBuilder hubConnectionBuilder)
{
- return hubConnectionBuilder.WithHubProtocol(new JsonHubProtocol(new JsonSerializer()));
+ return hubConnectionBuilder.WithHubProtocol(new JsonHubProtocol());
+ }
+
+ public static IHubConnectionBuilder WithJsonProtocol(this IHubConnectionBuilder hubConnectionBuilder, JsonSerializerSettings serializerSettings)
+ {
+ return hubConnectionBuilder.WithHubProtocol(new JsonHubProtocol(JsonSerializer.Create(serializerSettings)));
+ }
+
+ public static IHubConnectionBuilder WithJsonProtocol(this IHubConnectionBuilder hubConnectionBuilder, JsonSerializer jsonSerializer)
+ {
+ return hubConnectionBuilder.WithHubProtocol(new JsonHubProtocol(jsonSerializer));
}
public static IHubConnectionBuilder WithMessagePackProtocol(this IHubConnectionBuilder hubConnectionBuilder)
@@ -26,6 +37,16 @@ namespace Microsoft.AspNetCore.SignalR.Client
return hubConnectionBuilder.WithHubProtocol(new MessagePackHubProtocol());
}
+ public static IHubConnectionBuilder WithMessagePackProtocol(this IHubConnectionBuilder hubConnectionBuilder, SerializationContext serializationContext)
+ {
+ if (serializationContext == null)
+ {
+ throw new ArgumentNullException(nameof(serializationContext));
+ }
+
+ return hubConnectionBuilder.WithHubProtocol(new MessagePackHubProtocol(serializationContext));
+ }
+
public static IHubConnectionBuilder WithLoggerFactory(this IHubConnectionBuilder hubConnectionBuilder, ILoggerFactory loggerFactory)
{
hubConnectionBuilder.AddSetting(HubConnectionBuilderDefaults.LoggerFactoryKey,
diff --git a/src/Microsoft.AspNetCore.SignalR.Common/Internal/Protocol/JsonHubProtocol.cs b/src/Microsoft.AspNetCore.SignalR.Common/Internal/Protocol/JsonHubProtocol.cs
index 4bf45cd274..fb5aea9f8f 100644
--- a/src/Microsoft.AspNetCore.SignalR.Common/Internal/Protocol/JsonHubProtocol.cs
+++ b/src/Microsoft.AspNetCore.SignalR.Common/Internal/Protocol/JsonHubProtocol.cs
@@ -7,6 +7,7 @@ using System.IO;
using Microsoft.AspNetCore.SignalR.Internal.Formatters;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
+using Newtonsoft.Json.Serialization;
namespace Microsoft.AspNetCore.SignalR.Internal.Protocol
{
@@ -28,6 +29,15 @@ namespace Microsoft.AspNetCore.SignalR.Internal.Protocol
// ONLY to be used for application payloads (args, return values, etc.)
private JsonSerializer _payloadSerializer;
+ ///
+ /// Creates an instance of the using the default
+ /// to serialize application payloads (arguments, results, etc.). The serialization of the outer protocol can
+ /// NOT be changed using this serializer.
+ ///
+ public JsonHubProtocol()
+ : this(JsonSerializer.Create(CreateDefaultSerializerSettings()))
+ { }
+
///
/// Creates an instance of the using the specified
/// to serialize application payloads (arguments, results, etc.). The serialization of the outer protocol can
@@ -249,5 +259,10 @@ namespace Microsoft.AspNetCore.SignalR.Internal.Protocol
return new CompletionMessage(invocationId, error, result: payload, hasResult: true);
}
}
+
+ public static JsonSerializerSettings CreateDefaultSerializerSettings()
+ {
+ return new JsonSerializerSettings { ContractResolver = new CamelCasePropertyNamesContractResolver() };
+ }
}
}
diff --git a/src/Microsoft.AspNetCore.SignalR.Common/Internal/Protocol/MessagePackHubProtocol.cs b/src/Microsoft.AspNetCore.SignalR.Common/Internal/Protocol/MessagePackHubProtocol.cs
index 22e90fe437..c75c681222 100644
--- a/src/Microsoft.AspNetCore.SignalR.Common/Internal/Protocol/MessagePackHubProtocol.cs
+++ b/src/Microsoft.AspNetCore.SignalR.Common/Internal/Protocol/MessagePackHubProtocol.cs
@@ -20,18 +20,19 @@ namespace Microsoft.AspNetCore.SignalR.Internal.Protocol
private const int VoidResult = 2;
private const int NonVoidResult = 3;
- private static readonly SerializationContext _serializationContext;
+ private readonly SerializationContext _serializationContext;
public string Name => "messagepack";
public ProtocolType Type => ProtocolType.Binary;
- static MessagePackHubProtocol()
+ public MessagePackHubProtocol()
+ : this(CreateDefaultSerializationContext())
+ { }
+
+ public MessagePackHubProtocol(SerializationContext serializationContext)
{
- // serializes objects (here: arguments and results) as maps so that property names are preserved
- _serializationContext = new SerializationContext { SerializationMethod = SerializationMethod.Map };
- // allows for serializing objects that cannot be deserialized due to the lack of the default ctor etc.
- _serializationContext.CompatibilityOptions.AllowAsymmetricSerializer = true;
+ _serializationContext = serializationContext;
}
public bool TryParseMessages(ReadOnlyBuffer input, IInvocationBinder binder, out IList messages)
@@ -156,7 +157,7 @@ namespace Microsoft.AspNetCore.SignalR.Internal.Protocol
}
}
- private static void WriteInvocationMessage(InvocationMessage invocationMessage, Packer packer, Stream output)
+ private void WriteInvocationMessage(InvocationMessage invocationMessage, Packer packer, Stream output)
{
packer.PackArrayHeader(5);
packer.Pack(InvocationMessageType);
@@ -291,5 +292,15 @@ namespace Microsoft.AspNetCore.SignalR.Internal.Protocol
throw new FormatException($"Deserializing object of the `{type.Name}` type for '{field}' failed.", msgPackException);
}
+
+ public static SerializationContext CreateDefaultSerializationContext()
+ {
+ // serializes objects (here: arguments and results) as maps so that property names are preserved
+ var serializationContext = new SerializationContext { SerializationMethod = SerializationMethod.Map };
+ // allows for serializing objects that cannot be deserialized due to the lack of the default ctor etc.
+ serializationContext.CompatibilityOptions.AllowAsymmetricSerializer = true;
+
+ return serializationContext;
+ }
}
}
diff --git a/src/Microsoft.AspNetCore.SignalR.Core/HubOptions.cs b/src/Microsoft.AspNetCore.SignalR.Core/HubOptions.cs
index b1d6f40cdd..f652ea6755 100644
--- a/src/Microsoft.AspNetCore.SignalR.Core/HubOptions.cs
+++ b/src/Microsoft.AspNetCore.SignalR.Core/HubOptions.cs
@@ -1,12 +1,15 @@
// Copyright (c) .NET Foundation. All rights reserved.
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
+using Microsoft.AspNetCore.SignalR.Internal.Protocol;
+using MsgPack.Serialization;
using Newtonsoft.Json;
namespace Microsoft.AspNetCore.SignalR
{
public class HubOptions
{
- public JsonSerializerSettings JsonSerializerSettings { get; set; } = new JsonSerializerSettings();
+ public JsonSerializerSettings JsonSerializerSettings { get; set; } = JsonHubProtocol.CreateDefaultSerializerSettings();
+ public SerializationContext MessagePackSerializationContext { get; set; } = MessagePackHubProtocol.CreateDefaultSerializationContext();
}
}
diff --git a/src/Microsoft.AspNetCore.SignalR.Core/Internal/DefaultHubProtocolResolver.cs b/src/Microsoft.AspNetCore.SignalR.Core/Internal/DefaultHubProtocolResolver.cs
index bb0d44bf97..fe2a59f7bd 100644
--- a/src/Microsoft.AspNetCore.SignalR.Core/Internal/DefaultHubProtocolResolver.cs
+++ b/src/Microsoft.AspNetCore.SignalR.Core/Internal/DefaultHubProtocolResolver.cs
@@ -24,7 +24,7 @@ namespace Microsoft.AspNetCore.SignalR.Internal
case "json":
return new JsonHubProtocol(JsonSerializer.Create(_options.Value.JsonSerializerSettings));
case "messagepack":
- return new MessagePackHubProtocol();
+ return new MessagePackHubProtocol(_options.Value.MessagePackSerializationContext);
default:
throw new NotSupportedException($"The protocol '{protocolName ?? "(null)"}' is not supported.");
}
diff --git a/test/Microsoft.AspNetCore.SignalR.Client.FunctionalTests/HubConnectionTests.cs b/test/Microsoft.AspNetCore.SignalR.Client.FunctionalTests/HubConnectionTests.cs
index dbf86e7d66..a9a02a0f72 100644
--- a/test/Microsoft.AspNetCore.SignalR.Client.FunctionalTests/HubConnectionTests.cs
+++ b/test/Microsoft.AspNetCore.SignalR.Client.FunctionalTests/HubConnectionTests.cs
@@ -245,7 +245,7 @@ namespace Microsoft.AspNetCore.SignalR.Client.FunctionalTests
public static IEnumerable HubProtocols =>
new IHubProtocol[]
{
- new JsonHubProtocol(new JsonSerializer()),
+ new JsonHubProtocol(),
new MessagePackHubProtocol(),
};
diff --git a/test/Microsoft.AspNetCore.SignalR.Client.Tests/HubConnectionExtensionsTests.cs b/test/Microsoft.AspNetCore.SignalR.Client.Tests/HubConnectionExtensionsTests.cs
index 4c2f15fc2d..34e0a4b9ae 100644
--- a/test/Microsoft.AspNetCore.SignalR.Client.Tests/HubConnectionExtensionsTests.cs
+++ b/test/Microsoft.AspNetCore.SignalR.Client.Tests/HubConnectionExtensionsTests.cs
@@ -97,7 +97,7 @@ namespace Microsoft.AspNetCore.SignalR.Client.Tests
private async Task InvokeOn(Action> onAction, object[] args)
{
var connection = new TestConnection();
- var hubConnection = new HubConnection(connection, new JsonHubProtocol(new JsonSerializer()), new LoggerFactory());
+ var hubConnection = new HubConnection(connection, new JsonHubProtocol(), new LoggerFactory());
var handlerTcs = new TaskCompletionSource