JavaScript не может подключиться к WebSocket, размещенному на KestrelJavascript

Форум по Javascript
Ответить
Anonymous
 JavaScript не может подключиться к WebSocket, размещенному на Kestrel

Сообщение Anonymous »

У меня есть сервер Kestrel .NET, который обслуживает соединение через веб-сокет:

Код: Выделить всё

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();
WebSocketController построен следующим образом:

Код: Выделить всё

[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));
}
}
Проблема заключается в том, что я не могу подключиться к Websocket из JavaScript. Я запускаю простой let ws = new WebSocket("wss://localhost/api/ws/ptlcontrol"); и получаю:

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
Это действительно так, поскольку я никогда не принимаю вызовы CONNECT. Однако рукопожатие Websocket, по-видимому, работает по-другому, и серверная часть должна обрабатывать это правильно.
Очевидно, браузер хочет что-то проксировать здесь. Но что? И почему? И как? У меня нет настройки прокси.
Я пробовал добавить сертификаты разработчика (безрезультатно), добавив 127.0.0.1 localhost к хостам, но, похоже, ничего не работает.
Когда я использую 127.0.0.1 вместо localhost, это работает. А иногда это просто работает (а почему бы и нет?).
Кроме того, у меня есть расширение для тестирования WebSocket в Chrome, у которого также нет проблем с подключением к сокету.
Что мне здесь не хватает? Почему этот простой вызов Websocket завершается неудачей? Или как я могу хотя бы получить достойное описательное сообщение об этой ошибке?

Подробнее здесь: https://stackoverflow.com/questions/798 ... by-kestrel
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Javascript»