【发布时间】:2019-10-05 21:00:31
【问题描述】:
我正在尝试在我的 ASP.NET Core 3.0 Blazor(服务器端)应用程序和 Azure SignalR 服务之间建立连接。我最终会将我的 SignalR 客户端(服务)注入到一些 Blazor 组件中,以便它们实时更新我的 UI/DOM。
我的问题是,当我在集线器连接上调用 .StartAsync() 方法时收到以下消息:
响应状态码不表示成功:404(未找到)。
BootstrapSignalRClient.cs
此文件加载我的 SignalR 服务配置,包括 URL、连接字符串、密钥、方法名称和集线器名称。这些设置在静态类SignalRServiceConfiguration 中被捕获并在以后使用。
public static class BootstrapSignalRClient
{
public static IServiceCollection AddSignalRServiceClient(this IServiceCollection services, IConfiguration configuration)
{
SignalRServiceConfiguration signalRServiceConfiguration = new SignalRServiceConfiguration();
configuration.Bind(nameof(SignalRServiceConfiguration), signalRServiceConfiguration);
services.AddSingleton(signalRServiceConfiguration);
services.AddSingleton<ISignalRClient, SignalRClient>();
return services;
}
}
SignalRServiceConfiguration.cs
public class SignalRServiceConfiguration
{
public string ConnectionString { get; set; }
public string Url { get; set; }
public string MethodName { get; set; }
public string Key { get; set; }
public string HubName { get; set; }
}
SignalRClient.cs
public class SignalRClient : ISignalRClient
{
public delegate void ReceiveMessage(string message);
public event ReceiveMessage ReceiveMessageEvent;
private HubConnection hubConnection;
public SignalRClient(SignalRServiceConfiguration signalRConfig)
{
hubConnection = new HubConnectionBuilder()
.WithUrl(signalRConfig.Url + signalRConfig.HubName)
.Build();
}
public async Task<string> StartListening(string id)
{
// Register listener for a specific id
hubConnection.On<string>(id, (message) =>
{
if (ReceiveMessageEvent != null)
{
ReceiveMessageEvent.Invoke(message);
}
});
try
{
// Start the SignalR Service connection
await hubConnection.StartAsync(); //<---I get an exception here
return hubConnection.State.ToString();
}
catch (Exception ex)
{
return ex.Message;
}
}
private void ReceiveMessage(string message)
{
response = JsonConvert.DeserializeObject<dynamic>(message);
}
}
我有使用 SignalR 和 .NET Core 的经验,您可以在其中添加它,以便使用 .AddSignalR().AddAzureSignalR() 的 Startup.cs 文件并在应用程序配置中映射一个集线器,并且这样做需要建立某些“配置”参数(即连接字符串)。
鉴于我的情况,HubConnectionBuilder 从哪里获取连接字符串或密钥以对 SignalR 服务进行身份验证?
404 消息是否可能是缺少密钥/连接字符串的结果?
【问题讨论】:
-
.WithUrl(signalRConfig.Url + signalRConfig.HubName)你能确认这导致了正确的 URL 吗? (通过断点还是日志记录?) -
我发现将基本 Uri 设置为
Uri并通过 Uri(Uri, string) 构建完整的 Uri 很有用 -
有趣的是,这是一条“红鲱鱼”,与 404 无关。
标签: c# signalr signalr.client asp.net-core-signalr azure-signalr