Код: Выделить всё
var builder = WebApplication.CreateBuilder(args);
using (var db = new PTLCloudDatabase(builder.Configuration))
{
db.Setup();
}
builder.Services.AddControllers();
builder.Services.AddDbContext();
builder.Services.AddSingleton
();
builder.Services.AddSingleton();
builder.Services.AddSingleton();
builder.Services.AddEndpointsApiExplorer();
builder.Services.AddSwaggerGen();
builder.Services.AddLogging(logging =>
{
logging.AddConsole();
logging.AddDebug();
});
var app = builder.Build();
app.UseDefaultFiles();
app.UseStaticFiles();
app.UseWebSockets();
// Configure the HTTP request pipeline.
if (app.Environment.IsDevelopment())
{
app.UseSwagger();
app.UseSwaggerUI();
}
app.UseHttpsRedirection();
app.UseAuthentication();
app.UseAuthorization();
app.MapControllers();
app.MapFallbackToFile("/index.html");
app.Run();
Код: Выделить всё
[ApiController]
[Route("api/[controller]")]
public class WsController : ControllerBase
private async Task IsWebSocketRequest()
{
if (HttpContext.WebSockets.IsWebSocketRequest)
{
return true;
}
HttpContext.Response.StatusCode = StatusCodes.Status400BadRequest;
await HttpContext.Response.Body.WriteAsync(Encoding.UTF8.GetBytes("HTTP400: This endpoint only accepts WebSocket requests."));
return false;
}
[HttpGet("ptlcontrol")]
public async Task PtlControlSocket()
{
if (! await IsWebSocketRequest()) return;
// Get the WebSocketHandler instance from the service provider
var handler = HttpContext.RequestServices.GetRequiredService
();
handler.MessageParser = new MessageParser();
handler.MessageProcessor = new MessageProcessor(
HttpContext.RequestServices.GetRequiredService(),
HttpContext.RequestServices.GetRequiredService()
);
using var webSocket = await HttpContext.WebSockets.AcceptWebSocketAsync();
await handler.Handle(new WebSocketAdapter(webSocket));
}
}
wstester.html:19 Ошибка подключения WebSocket к 'wss://localhost/api/ws/ptlcontrol':
При просмотре журналов моего сервера я вижу это возвращает HTTP405 при вызове HTTP CONNECT:
Код: Выделить всё
info: Microsoft.AspNetCore.Hosting.Diagnostics[2]
Request finished HTTP/2 CONNECT https://localhost/api/ws/ptlcontrol - 405 0 - 25.0023ms
Очевидно, браузер хочет что-то проксировать здесь. Но что? И почему? И как? У меня нет настройки прокси.
Я пробовал добавить сертификаты разработчика (безрезультатно), добавив 127.0.0.1 localhost к хостам, но, похоже, ничего не работает.
Когда я использую 127.0.0.1 вместо localhost, это работает. А иногда это просто работает (а почему бы и нет?).
Кроме того, у меня есть расширение для тестирования WebSocket в Chrome, у которого также нет проблем с подключением к сокету.
Что мне здесь не хватает? Почему этот простой вызов Websocket завершается неудачей? Или как я могу хотя бы получить достойное описательное сообщение об этой ошибке?
Подробнее здесь: https://stackoverflow.com/questions/798 ... by-kestrel
Мобильная версия