diff --git a/src/SignalR/server/Core/src/Internal/DefaultHubDispatcher.cs b/src/SignalR/server/Core/src/Internal/DefaultHubDispatcher.cs index 11c70a87a2..ff59c581bb 100644 --- a/src/SignalR/server/Core/src/Internal/DefaultHubDispatcher.cs +++ b/src/SignalR/server/Core/src/Internal/DefaultHubDispatcher.cs @@ -547,6 +547,11 @@ namespace Microsoft.AspNetCore.SignalR.Internal foreach (var methodInfo in HubReflectionHelper.GetHubMethods(hubType)) { + if (methodInfo.IsGenericMethod) + { + throw new NotSupportedException($"Method '{methodInfo.Name}' is a generic method which is not supported on a Hub."); + } + var methodName = methodInfo.GetCustomAttribute()?.Name ?? methodInfo.Name; diff --git a/src/SignalR/server/SignalR/test/HubConnectionHandlerTestUtils/Hubs.cs b/src/SignalR/server/SignalR/test/HubConnectionHandlerTestUtils/Hubs.cs index 3cae11661a..c9fc9e96ba 100644 --- a/src/SignalR/server/SignalR/test/HubConnectionHandlerTestUtils/Hubs.cs +++ b/src/SignalR/server/SignalR/test/HubConnectionHandlerTestUtils/Hubs.cs @@ -569,6 +569,13 @@ namespace Microsoft.AspNetCore.SignalR.Tests } } + public class GenericMethodHub : Hub + { + public void GenericMethod() + { + } + } + public class DisposeTrackingHub : TestHub { private readonly TrackDispose _trackDispose; diff --git a/src/SignalR/server/SignalR/test/HubConnectionHandlerTests.cs b/src/SignalR/server/SignalR/test/HubConnectionHandlerTests.cs index d24811e9da..e25a1ded2f 100644 --- a/src/SignalR/server/SignalR/test/HubConnectionHandlerTests.cs +++ b/src/SignalR/server/SignalR/test/HubConnectionHandlerTests.cs @@ -1327,6 +1327,19 @@ namespace Microsoft.AspNetCore.SignalR.Tests } } + [Fact] + public void CannotHaveGenericMethodOnHub() + { + using (StartVerifiableLog()) + { + var serviceProvider = HubConnectionHandlerTestUtils.CreateServiceProvider(null, LoggerFactory); + + var exception = Assert.Throws(() => serviceProvider.GetService>()); + + Assert.Equal("Method 'GenericMethod' is a generic method which is not supported on a Hub.", exception.Message); + } + } + [Theory] [MemberData(nameof(HubTypes))] public async Task BroadcastHubMethodSendsToAllClients(Type hubType)