Я пытаюсь реализовать SignalR Core в .Net core 2.0
веб-приложении и реализовать клиентскую часть в Xamarin.Android
приложении. Я создал новое решение для веб-приложения .Net core 2.0, импортировал 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): значение заголовка Sec-WebSocket-Accept «LNqQiPhES / zOwW10TMji4AVvvoA =» недопустимо. в System.Net.WebSockets.WebSocketHandle.ValidateAndTrackHeader (System.String targetHeaderName, System.String targetHeaderValue, System.String foundHeaderName, System.String foundHeaderValue, System.Boolean & foundHeader `) [0x6000ec06ebc8c8c08c08c8c08c08c08c08c08c8c8c08c08c08c8c)
Я нашел этот пост, который был связан с Amazon 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();
Этому парню было предложено переключить слушателей LoadBalancer с HTTP на TCP, я попробовал это, но проблема все еще осталась. Также я прочитал предложение установить веб-сокеты в ISS на Консоли управления AWS, но я нигде не могу найти эту опцию?
Любая помощь или предложения приветствуются