From 5d170de7696694189bd531858c5f3410f1241975 Mon Sep 17 00:00:00 2001 From: Vasilev Pyotr Date: Fri, 10 Jul 2020 03:58:47 +0300 Subject: [PATCH] Add support custom client hub method name (#23614) --- .../Core/src/Internal/TypedClientBuilder.cs | 6 +++- .../test/Internal/TypedClientBuilderTests.cs | 30 +++++++++++++++++++ 2 files changed, 35 insertions(+), 1 deletion(-) diff --git a/src/SignalR/server/Core/src/Internal/TypedClientBuilder.cs b/src/SignalR/server/Core/src/Internal/TypedClientBuilder.cs index b0343577cb..b5a9a56d6e 100644 --- a/src/SignalR/server/Core/src/Internal/TypedClientBuilder.cs +++ b/src/SignalR/server/Core/src/Internal/TypedClientBuilder.cs @@ -144,6 +144,10 @@ namespace Microsoft.AspNetCore.SignalR.Internal paramTypes = paramTypes.Take(paramTypes.Length - 1).ToArray(); } + var methodName = + interfaceMethodInfo.GetCustomAttribute()?.Name ?? + interfaceMethodInfo.Name; + var generator = methodBuilder.GetILGenerator(); // Declare local variable to store the arguments to IClientProxy.SendCoreAsync @@ -154,7 +158,7 @@ namespace Microsoft.AspNetCore.SignalR.Internal generator.Emit(OpCodes.Ldfld, proxyField); // The first argument to IClientProxy.SendCoreAsync is this method's name - generator.Emit(OpCodes.Ldstr, interfaceMethodInfo.Name); + generator.Emit(OpCodes.Ldstr, methodName); // Create an new object array to hold all the parameters to this method generator.Emit(OpCodes.Ldc_I4, paramTypes.Length); // Stack: diff --git a/src/SignalR/server/SignalR/test/Internal/TypedClientBuilderTests.cs b/src/SignalR/server/SignalR/test/Internal/TypedClientBuilderTests.cs index 83b601d6f4..ad9ee99d0a 100644 --- a/src/SignalR/server/SignalR/test/Internal/TypedClientBuilderTests.cs +++ b/src/SignalR/server/SignalR/test/Internal/TypedClientBuilderTests.cs @@ -38,6 +38,30 @@ namespace Microsoft.AspNetCore.SignalR.Tests.Internal await task.OrTimeout(); } + [Fact] + public async Task ProducesImplementationThatProxiesMethodsToIRenamedClientProxyAsync() + { + var clientProxy = new MockProxy(); + var typedProxy = TypedClientBuilder.Build(clientProxy); + + var objArg = new object(); + var task = typedProxy.MethodAsync("foo", 42, objArg); + Assert.False(task.IsCompleted); + + Assert.Collection(clientProxy.Sends, + send => + { + Assert.Equal("Method", send.Method); + Assert.Equal("foo", send.Arguments[0]); + Assert.Equal(42, send.Arguments[1]); + Assert.Equal(CancellationToken.None, send.CancellationToken); + Assert.Same(objArg, send.Arguments[2]); + send.Complete(); + }); + + await task.OrTimeout(); + } + [Fact] public async Task SupportsSubInterfaces() { @@ -189,6 +213,12 @@ namespace Microsoft.AspNetCore.SignalR.Tests.Internal Task Method(string arg1, int arg2, object arg3); } + public interface IRenamedTestClient + { + [HubMethodName("Method")] + Task MethodAsync(string arg1, int arg2, object arg3); + } + public interface IVoidMethodClient { void Method(string arg1, int arg2, object arg3);