我试图在.Net core 2.0
Web应用程序中实现SignalR Core,并在Xamarin.Android
应用程序中实现客户端。
我创建了一个全新的.Net核心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
并初始化此示例中的连接
我的代码:
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):&#39; Sec-WebSocket-Accept&#39;标题值&#39; LNqQiPhES / zOwW10TMji4AVvvoA =&#39;是无效的。 在System.Net.WebSockets.WebSocketHandle.ValidateAndTrackHeader(System.String targetHeaderName,System.String targetHeaderValue,System.String foundHeaderName,System.String foundHeaderValue,System.Boolean&amp; foundHeader)[0x0002c] in&lt; 6c708cf596db438ebfc6b7e012659eee&gt;:0`
我发现此帖与Amazon ELB相关并设置了websockets
(Elastic Beanstalk stripping Sec-WebSocket-Accept header)
此帖也发现同样的问题
(https://forums.aws.amazon.com/thread.jspa?messageID=613220)
正如在这篇文章中所说,如果我选择&#34; LongPolling&#34;作为运输
hubConnection = new HubConnectionBuilder()
.WithUrl("http://*******.eu-central-1.elasticbeanstalk.com/chat")
.WithTransport(TransportType.LongPolling)
.Build();
这家伙被建议将LoadBalancer监听器从HTTP切换到TCP,我试过这个,但问题仍然存在 此外,我还阅读了在AWS管理控制台上的ISS中安装websockets的建议,但我无法在任何地方找到此选项?
赞赏任何形式的帮助或建议
答案 0 :(得分:0)
您需要登录到Elastic BeanStalk服务器,并在服务器管理器的服务器角色中启用Websocket协议,这已为我修复了该问题。