diff --git a/src/SignalRServiceExtension/Config/HubProtocol.cs b/src/SignalRServiceExtension/Config/HubProtocol.cs new file mode 100644 index 0000000..08c037c --- /dev/null +++ b/src/SignalRServiceExtension/Config/HubProtocol.cs @@ -0,0 +1,23 @@ +// Copyright (c) Microsoft. All rights reserved. +// Licensed under the MIT license. See LICENSE file in the project root for full license information. +#if NETCOREAPP3_1 +using Microsoft.AspNetCore.SignalR.Protocol; + +namespace Microsoft.Azure.WebJobs.Extensions.SignalRService +{ + internal enum HubProtocol + { + /// + /// Implements the SignalR Hub Protocol using System.Text.Json. + /// + /// + SystemTextJson, + + /// + /// Implements the SignalR Hub Protocol using Newtonsoft.Json. + /// + /// + NewtonsoftJson + } +} +#endif \ No newline at end of file diff --git a/src/SignalRServiceExtension/Config/ServiceManagerStore.cs b/src/SignalRServiceExtension/Config/ServiceManagerStore.cs index d991ac4..91ab5a5 100644 --- a/src/SignalRServiceExtension/Config/ServiceManagerStore.cs +++ b/src/SignalRServiceExtension/Config/ServiceManagerStore.cs @@ -24,12 +24,15 @@ internal class ServiceManagerStore : IServiceManagerStore private readonly IConfiguration configuration; private readonly IEndpointRouter router; private readonly ConcurrentDictionary store = new ConcurrentDictionary(); + private readonly ILogger logger; + private const string hubProtocolWarning = "It's invalid to configure hub protocol on Azure Functions runtime V2. Newtonsoft.Json protocol will be used."; public ServiceManagerStore(IConfiguration configuration, ILoggerFactory loggerFactory, IEndpointRouter router = null) { this.loggerFactory = loggerFactory; this.configuration = configuration; this.router = router; + logger = this.loggerFactory.CreateLogger(); } public IInternalServiceHubContextStore GetOrAddByConnectionStringKey(string connectionStringKey) @@ -66,13 +69,23 @@ private IInternalServiceHubContextStore CreateHubContextStore(string connectionS { services.AddSingleton(router); } +#if NETSTANDARD2_0 + if (configuration[Constants.AzureSignalRHubProtocol] != null) + { + logger.LogWarning(hubProtocolWarning); + } +#endif #if NETCOREAPP3_1 - var jsonProtocols = services.Where(s => s.ServiceType == typeof(IHubProtocol) && s.ImplementationType == typeof(JsonHubProtocol)).ToArray(); - foreach (var protocol in jsonProtocols) + var protocolStr = configuration.GetValue(Constants.AzureSignalRHubProtocol, HubProtocol.SystemTextJson); + if (protocolStr == HubProtocol.NewtonsoftJson) { - services.Remove(protocol); + var jsonProtocols = services.Where(s => s.ServiceType == typeof(IHubProtocol) && s.ImplementationType == typeof(JsonHubProtocol)).ToArray(); + foreach (var protocol in jsonProtocols) + { + services.Remove(protocol); + } + services.AddSingleton(); } - services.AddSingleton(); #endif services.AddSingleton(services.ToList() as IReadOnlyCollection); return services.BuildServiceProvider() diff --git a/src/SignalRServiceExtension/Constants.cs b/src/SignalRServiceExtension/Constants.cs index a19c5a9..fde4f80 100644 --- a/src/SignalRServiceExtension/Constants.cs +++ b/src/SignalRServiceExtension/Constants.cs @@ -7,6 +7,7 @@ internal static class Constants { public const string AzureSignalRConnectionStringName = "AzureSignalRConnectionString"; public const string AzureSignalREndpoints = "Azure:SignalR:Endpoints"; + public const string AzureSignalRHubProtocol = "Azure:SignalR:HubProtocol"; public const string ServiceTransportTypeName = "AzureSignalRServiceTransportType"; public const string AsrsHeaderPrefix = "X-ASRS-"; public const string AsrsConnectionIdHeader = AsrsHeaderPrefix + "Connection-Id";