SignalR не может подключиться от клиента к серверу с помощью любого доступного транспортаC#

Место общения программистов C#
Ответить
Anonymous
 SignalR не может подключиться от клиента к серверу с помощью любого доступного транспорта

Сообщение Anonymous »

Я пытаюсь подключиться к веб-сокету, установленному с помощью SignalR на моем сервере (.NET).
Мой клиент (JavaScript) начинает согласование, получает ответ с идентификатором соединения, ConnectionToken и т. д., но впоследствии не может подключиться ни к одному из доступных методов транспорта.
Последняя трассировка отладки, которую я получаю, следующая:
< р>

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

[2022-11-17T10:21:02.093Z] Debug: HubConnection failed to start successfully because of error 'Error: Unable to connect to the server with any of the available transports. WebSockets failed: Error: There was an error with the transport. ServerSentEvents failed: Error: Error occurred LongPolling failed: Error'.
Код моего сервера:
Startup.cs

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

using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting;
using Microsoft.AspNetCore.Http;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Mvc;

namespace Sample
{
public class Startup
{
// This method gets called by the runtime. Use this method to add services to the container.
// For more information on how to configure your application, visit https://go.microsoft.com/fwlink/?LinkID=398940
public void ConfigureServices(IServiceCollection services)
{
services.AddMvc(options => options.EnableEndpointRouting = false).SetCompatibilityVersion(CompatibilityVersion.Version_3_0).AddNewtonsoftJson();
services.AddSignalR().AddNewtonsoftJsonProtocol(opt => {
opt.PayloadSerializerSettings.ReferenceLoopHandling = Newtonsoft.Json.ReferenceLoopHandling.Ignore;
});
services.AddCors(o => o.AddPolicy("MyPolicy", builder =>
{
builder.WithOrigins("http://localhost:8080", "http://127.0.0.1:8080")
.AllowAnyMethod()
.AllowAnyHeader()
.AllowCredentials();
}));
}

// This method gets called by the runtime.  Use this method to configure the HTTP request pipeline.
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
app.UseFileServer();
app.UseDefaultFiles();
app.UseStaticFiles();
app.UseCors("MyPolicy");
app.UseMvc();
app.UseRouting();
app.UseEndpoints(routes =>
{
routes.MapHub("/api/signalr/designautomation");
});

}
}
}
Контроллер:

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

using Autodesk.Forge;
using Autodesk.Forge.DesignAutomation;
using Autodesk.Forge.DesignAutomation.Model;
using Autodesk.Forge.Model;
using Microsoft.AspNetCore.Hosting;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.SignalR;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Threading.Tasks;

namespace Sample.Controllers
{
[ApiController]
public class ServiceController : Controller
{
// Design Automation v3 API
DesignAutomationClient _designAutomation;
// Used to access the application folder (temp location for files & bundles)
private IWebHostEnvironment _env;
// used to access the SignalR Hub
private IHubContext _hubContext;

public ServiceController(IWebHostEnvironment env, IHubContext hubContext, DesignAutomationClient api)
{
_designAutomation = api;
_env = env;
_hubContext = hubContext;
}
}

/// 
/// Class uses for SignalR
/// 
public class DesignAutomationHub : Microsoft.AspNetCore.SignalR.Hub
{
public string GetConnectionId() { return Context.ConnectionId; }
}
}
Клиент:

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

var connection;
var connectionId;

function startConnection(onReady) {
if (connection && connection.connectionState) {
if (onReady) onReady();
return;
}
connection = new signalR.HubConnectionBuilder()
.withUrl(
"http:///api/signalr/designautomation"
)
.configureLogging(signalR.LogLevel.Trace)
.build();
connection.start().then(function () {
connection.invoke("getConnectionId").then(function (id) {
connectionId = id;
if (onReady) onReady();
});
});

connection.on("downloadResult", function (url) {
console.log('Download result file here');
});

connection.on("onComplete", function (message) {
console.log(message);
});
}
Я тестировал его локально с сервером и клиентом на одном компьютере, и все работает нормально. Но после теста развертывания я получаю ошибки. (Веб-сокеты активированы на сервере.)
Также Postman может установить соединение с веб-сокетом, просто мой клиент не работает.
Буду признателен за любые своего рода помощь. Заранее спасибо!
РЕДАКТИРОВАТЬ:
Я также пытался подключиться к SignalR через (здесь) описанную альтернативу клиентской стороне SignalR. р>

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

async function connectToWebsocket(negotiations) {
let token = encodeURIComponent(negotiations.connectionToken);
let wssPath = `ws:///api/signalr/designautomation?id=${token}`;
let ws = new WebSocket(wssPath);

console.log(ws);
}

async function connectToSignalR() {
$.ajax({
url: "/api/signalr/designautomation/negotiate?negotiateVersion=1",
contentType: "application/json",
dataType: "json",
headers: { "Access-Control-Allow-Origin": "*" },
type: "POST",
success: function (res) {
console.log(res);
connectToWebsocket(res);
},
error: function (error) {
console.log(error);
},
});
}
Все равно результат тот же. Я получаю ответ от согласования, но не могу подключиться к веб-сокету.
В качестве дополнительной информации. Мой «сервер» — это iis-express на Azure-VM с адресом, перенаправленным через ngrok.
ДРУГОЕ РЕДАКТИРОВАНИЕ:
Весь мой случай о использование SignalR состоит в том, чтобы запустить соединение через веб-сокет, которое серверы autodesk-forge могут выполнить обратный вызов, когда они завершат отправленную мной задачу, чтобы сообщить им, какие следующие задачи.
Я добавил тег, возможно, кто-то из это направление столкнулось с теми же проблемами и могло дать подсказку.
И ДРУГОЕ РЕДАКТИРОВАНИЕ:
Теперь я также попробовал подключиться к удаленному серверу с помощью самого простого пример, который я смог найти, пример чата от Microsoft.
Все те же проблемы. Я добавил сюда весь вывод консоли:
Изображение
Также мне интересно, может быть, есть что-то не так с моим CORS.
Но он определен так, как указано в каждом рабочем примере...

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

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

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

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

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

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