我正在尝试在.Net core 2.0
Web应用程序中实现SignalR Core,并在Xamarin.Android
应用程序中实现客户端。 我创建了一个新的 .Net core 2.0 Web 应用解决方案,并导入了Microsoft.AspNetCore.SignalR
并设置了 Startup.cs 文件,如以下示例所示
https://github.com/aspnet/SignalR-samples/blob/master/ChatSample/ChatSample/Startup.cs
我的代码:
public class Startup
{
public void ConfigureServices(IServiceCollection services)
{
services.AddSignalR();
}
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
app.UseFileServer();
app.UseSignalR(routes =>
{
routes.MapHub<ChatHub>("chat");
});
}
}
此项目已部署到 Amazon Elastic Bean Stalk。
在客户端,我已经导入了Microsoft.AspNetCore.SignalR.Client
并初始化了一个连接,如本示例中所示
https://github.com/aspnet/SignalR-samples/blob/master/XamarinAndroidChatClient/XamarinAndroidChatClient/MainActivity.cs
我的代码:
public async override void OnCreate(Bundle savedInstanceState)
{
base.OnCreate(savedInstanceState);
hubConnection = new HubConnectionBuilder()
.WithUrl("http://*******.eu-central-1.elasticbeanstalk.com/chat")
.Build();
try
{
await hubConnection.StartAsync();
}
catch(Exception ex)
{
System.Diagnostics.Debug.WriteLine(ex.StackTrace);
}
}
但是.StartAsync()
抛出此异常:
{System.Net.WebSockets.WebSocketException (0x80004005): 'Sec-WebSocket-Accept' 标头值 'LNqQiPhES/zOwW10TMji4AVvvoA=' 无效。 at System.Net.WebSockets.WebSocketHandle.ValidateAndTrackHeader (System.String targetHeaderName, System.String targetHeaderValue, System.String foundHeaderName, System.String foundHeaderValue, System.Boolean& foundHeader) [0x0002c] in <6c708cf596db438ebfc6b7e012659eee>:0 '
我找到了这篇与亚马逊ELB和设置网络套接字相关的帖子
(Elastic Beanstalk 剥离 Sec-WebSocket-Accept 标头)
也发现这篇文章有同样的问题
(https://forums.aws.amazon.com/thread.jspa?messageID=613220)
就像这篇文章一样,如果我选择"LongPolling"作为传输,事情就会正常
hubConnection = new HubConnectionBuilder()
.WithUrl("http://*******.eu-central-1.elasticbeanstalk.com/chat")
.WithTransport(TransportType.LongPolling)
.Build();
建议这家伙将负载均衡器侦听器从HTTP切换到TCP,我试过这个,但问题仍然存在 我还阅读了在 AWS 管理控制台上的 ISS 中安装 websockets 的建议,但我在任何地方都找不到此选项?
感谢任何形式的帮助或建议
您需要登录到 Elastic BeanStalk 服务器并在服务器管理器的服务器角色中启用 Websocket 协议,这为我修复了它。