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";