Provide a better error message when invoking a non-existant hub method (#2768)
This commit is contained in:
parent
c9104d4932
commit
a550ae6cc3
|
|
@ -136,7 +136,7 @@ namespace Microsoft.AspNetCore.SignalR.Internal
|
|||
{
|
||||
if (!_methods.TryGetValue(methodName, out var descriptor))
|
||||
{
|
||||
return Type.EmptyTypes;
|
||||
throw new HubException("Method does not exist.");
|
||||
}
|
||||
return descriptor.ParameterTypes;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -157,10 +157,10 @@ namespace Microsoft.AspNetCore.SignalR.Protocol
|
|||
}
|
||||
|
||||
var target = ReadString(input, ref offset, "target");
|
||||
var parameterTypes = binder.GetParameterTypes(target);
|
||||
|
||||
try
|
||||
{
|
||||
var parameterTypes = binder.GetParameterTypes(target);
|
||||
var arguments = BindArguments(input, ref offset, parameterTypes, resolver);
|
||||
return ApplyHeaders(headers, new InvocationMessage(invocationId, target, arguments));
|
||||
}
|
||||
|
|
@ -175,10 +175,10 @@ namespace Microsoft.AspNetCore.SignalR.Protocol
|
|||
var headers = ReadHeaders(input, ref offset);
|
||||
var invocationId = ReadInvocationId(input, ref offset);
|
||||
var target = ReadString(input, ref offset, "target");
|
||||
var parameterTypes = binder.GetParameterTypes(target);
|
||||
|
||||
try
|
||||
{
|
||||
var parameterTypes = binder.GetParameterTypes(target);
|
||||
var arguments = BindArguments(input, ref offset, parameterTypes, resolver);
|
||||
return ApplyHeaders(headers, new StreamInvocationMessage(invocationId, target, arguments));
|
||||
}
|
||||
|
|
|
|||
|
|
@ -464,7 +464,7 @@ namespace Microsoft.AspNetCore.SignalR.Client.FunctionalTests
|
|||
bool ExpectedErrors(WriteContext writeContext)
|
||||
{
|
||||
return writeContext.LoggerName == DefaultHubDispatcherLoggerName &&
|
||||
writeContext.EventId.Name == "UnknownHubMethod";
|
||||
writeContext.EventId.Name == "FailedInvokingHubMethod";
|
||||
}
|
||||
|
||||
var hubProtocol = HubProtocols[hubProtocolName];
|
||||
|
|
@ -476,7 +476,40 @@ namespace Microsoft.AspNetCore.SignalR.Client.FunctionalTests
|
|||
await connection.StartAsync().OrTimeout();
|
||||
|
||||
var ex = await Assert.ThrowsAsync<HubException>(() => connection.InvokeAsync("!@#$%")).OrTimeout();
|
||||
Assert.Equal("Unknown hub method '!@#$%'", ex.Message);
|
||||
Assert.Equal("Failed to invoke '!@#$%' due to an error on the server. HubException: Method does not exist.", ex.Message);
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
loggerFactory.CreateLogger<HubConnectionTests>().LogError(ex, "{ExceptionType} from test", ex.GetType().FullName);
|
||||
throw;
|
||||
}
|
||||
finally
|
||||
{
|
||||
await connection.DisposeAsync().OrTimeout();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
[Theory]
|
||||
[MemberData(nameof(HubProtocolsAndTransportsAndHubPaths))]
|
||||
public async Task ServerThrowsHubExceptionIfHubMethodCannotBeResolvedAndArgumentsPassedIn(string hubProtocolName, HttpTransportType transportType, string hubPath)
|
||||
{
|
||||
bool ExpectedErrors(WriteContext writeContext)
|
||||
{
|
||||
return writeContext.LoggerName == DefaultHubDispatcherLoggerName &&
|
||||
writeContext.EventId.Name == "FailedInvokingHubMethod";
|
||||
}
|
||||
|
||||
var hubProtocol = HubProtocols[hubProtocolName];
|
||||
using (StartVerifiableLog(out var loggerFactory, $"{nameof(ServerThrowsHubExceptionIfHubMethodCannotBeResolvedAndArgumentsPassedIn)}_{hubProtocol.Name}_{transportType}_{hubPath.TrimStart('/')}", expectedErrorsFilter: ExpectedErrors))
|
||||
{
|
||||
var connection = CreateHubConnection(hubPath, transportType, hubProtocol, loggerFactory);
|
||||
try
|
||||
{
|
||||
await connection.StartAsync().OrTimeout();
|
||||
|
||||
var ex = await Assert.ThrowsAsync<HubException>(() => connection.InvokeAsync("!@#$%", 10, "test")).OrTimeout();
|
||||
Assert.Equal("Failed to invoke '!@#$%' due to an error on the server. HubException: Method does not exist.", ex.Message);
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
|
|
@ -563,7 +596,7 @@ namespace Microsoft.AspNetCore.SignalR.Client.FunctionalTests
|
|||
bool ExpectedErrors(WriteContext writeContext)
|
||||
{
|
||||
return writeContext.LoggerName == DefaultHubDispatcherLoggerName &&
|
||||
writeContext.EventId.Name == "UnknownHubMethod";
|
||||
writeContext.EventId.Name == "FailedInvokingHubMethod";
|
||||
}
|
||||
|
||||
var hubProtocol = HubProtocols[hubProtocolName];
|
||||
|
|
@ -576,7 +609,7 @@ namespace Microsoft.AspNetCore.SignalR.Client.FunctionalTests
|
|||
|
||||
var channel = await connection.StreamAsChannelAsync<int>("!@#$%");
|
||||
var ex = await Assert.ThrowsAsync<HubException>(() => channel.ReadAllAsync().OrTimeout());
|
||||
Assert.Equal("Unknown hub method '!@#$%'", ex.Message);
|
||||
Assert.Equal("Failed to invoke '!@#$%' due to an error on the server. HubException: Method does not exist.", ex.Message);
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
|
|
|
|||
|
|
@ -799,7 +799,7 @@ namespace Microsoft.AspNetCore.SignalR.Tests
|
|||
|
||||
var result = await client.InvokeAsync(nameof(MethodHub.OnDisconnectedAsync)).OrTimeout();
|
||||
|
||||
Assert.Equal("Unknown hub method 'OnDisconnectedAsync'", result.Error);
|
||||
Assert.Equal("Failed to invoke 'OnDisconnectedAsync' due to an error on the server. HubException: Method does not exist.", result.Error);
|
||||
|
||||
// kill the connection
|
||||
client.Dispose();
|
||||
|
|
@ -837,7 +837,7 @@ namespace Microsoft.AspNetCore.SignalR.Tests
|
|||
|
||||
var result = await client.InvokeAsync(nameof(MethodHub.StaticMethod)).OrTimeout();
|
||||
|
||||
Assert.Equal("Unknown hub method 'StaticMethod'", result.Error);
|
||||
Assert.Equal("Failed to invoke 'StaticMethod' due to an error on the server. HubException: Method does not exist.", result.Error);
|
||||
|
||||
// kill the connection
|
||||
client.Dispose();
|
||||
|
|
@ -858,16 +858,16 @@ namespace Microsoft.AspNetCore.SignalR.Tests
|
|||
var connectionHandlerTask = await client.ConnectAsync(connectionHandler);
|
||||
|
||||
var result = await client.InvokeAsync(nameof(MethodHub.ToString)).OrTimeout();
|
||||
Assert.Equal("Unknown hub method 'ToString'", result.Error);
|
||||
Assert.Equal("Failed to invoke 'ToString' due to an error on the server. HubException: Method does not exist.", result.Error);
|
||||
|
||||
result = await client.InvokeAsync(nameof(MethodHub.GetHashCode)).OrTimeout();
|
||||
Assert.Equal("Unknown hub method 'GetHashCode'", result.Error);
|
||||
Assert.Equal("Failed to invoke 'GetHashCode' due to an error on the server. HubException: Method does not exist.", result.Error);
|
||||
|
||||
result = await client.InvokeAsync(nameof(MethodHub.Equals)).OrTimeout();
|
||||
Assert.Equal("Unknown hub method 'Equals'", result.Error);
|
||||
Assert.Equal("Failed to invoke 'Equals' due to an error on the server. HubException: Method does not exist.", result.Error);
|
||||
|
||||
result = await client.InvokeAsync(nameof(MethodHub.ReferenceEquals)).OrTimeout();
|
||||
Assert.Equal("Unknown hub method 'ReferenceEquals'", result.Error);
|
||||
Assert.Equal("Failed to invoke 'ReferenceEquals' due to an error on the server. HubException: Method does not exist.", result.Error);
|
||||
|
||||
// kill the connection
|
||||
client.Dispose();
|
||||
|
|
@ -889,7 +889,7 @@ namespace Microsoft.AspNetCore.SignalR.Tests
|
|||
|
||||
var result = await client.InvokeAsync(nameof(MethodHub.Dispose)).OrTimeout();
|
||||
|
||||
Assert.Equal("Unknown hub method 'Dispose'", result.Error);
|
||||
Assert.Equal("Failed to invoke 'Dispose' due to an error on the server. HubException: Method does not exist.", result.Error);
|
||||
|
||||
// kill the connection
|
||||
client.Dispose();
|
||||
|
|
|
|||
Loading…
Reference in New Issue