У меня есть приложение ASP.NET Webforms (работающее на .NET 4.8) и приложение ASP.NET Core 7 MVC. Я хочу установить соединение SignalR из приложения Webforms с приложением в MVC, чтобы при входе в систему клиентов в Webforms они обновляли концентратор в MVC.
То есть хаб находится в приложении MVC, и я хочу транслировать информацию клиентам через веб-формы. У меня уже есть логика для отправки сообщений клиентам в концентраторе из приложения MVC, но мне не удалось подключиться из клиента Webforms (т. е. из JavaScript) к концентратору в другом приложении.
Мой клиентский код для установления соединения в веб-формах выглядит следующим образом:
$(document).ready(function () {
var connection = $.hubConnection();
connection.url = "https://localhost:44312/chatHub";
var myChatHubProxy = connection.createHubProxy('chatHub');
connection.start()
.done(function () {
// Logic on connection start
})
.fail(function (err) {
console.error(err);
});
// Additional code.
});
Где https://localhost:44312/chatHub — URL-адрес приложения MVC. Ошибка, которую я получаю,
Ошибка во время запроса на согласование
а в трассировке стека есть только ссылки на файл JavaScript SignalR.





После моего теста вы можете использовать ту же версию клиента signalR, что и версия asp.net Core SignaleR Hub, и вам необходимо настроить соответствующую междоменную стратегию. В качестве ссылки можно использовать следующий пример:
Во-первых, концентратор signalR устанавливается через этот документ и соответствующий узел маршрутизации: document1, документ2
Во-вторых, вы можете использовать cdn напрямую, указав ту же версию asp.net Core signalR в веб-форме.
< script src = https://cdnjs.cloudflare.com/Ajax/libs/Microsoft-signalr/6.0.1/signalr.js > </script > или скачайте в документе .
Я реализую соответствующую часть подключения через chat.js:
Мои веб-формыchat.js:
"use strict";
const connection = new signalR.HubConnectionBuilder()
.withUrl(https://localhost:7105/chatHub, {
withCredentials: false
})
.configureLogging(signalR.LogLevel.Information)
.build();
document.getElementById("sendButton").disabled = true;
connection.on("ReceiveMessage", function (user, message) {
var li = document.createElement("li");
document.getElementById("messagesList").appendChild(li);
li.textContent = `${user} says ${message}`;
});
connection.start().then(function () {
document.getElementById("sendButton").disabled = false;
}).catch(function (err) {
return console.error(err.toString());
});
document.getElementById("sendButton").addEventListener("click", function (event) {
var user = document.getElementById("userInput").value;
var message = document.getElementById("messageInput").value;
connection.invoke("SendMessage", user, message).catch(function (err) {
return console.error(err.toString());
});
event.preventDefault();
});
Мой индекс веб-формы:
<!DOCTYPE html>
<html>
<head>
<title>SignalR Simple Chat</title>
<style type = "text/css">
.container {
background-color: #99CCFF;
border: thick solid #808080;
padding: 20px;
margin: 20px;
}
</style>
</head>
<body>
<div class = "container">
<div class = "row p-1">
<div class = "col-1">User</div>
<div class = "col-5"><input type = "text" id = "userInput" /></div>
</div>
<div class = "row p-1">
<div class = "col-1">Message</div>
<div class = "col-5"><input type = "text" class = "w-100" id = "messageInput" /></div>
</div>
<div class = "row p-1">
<div class = "col-6 text-end">
<input type = "button" id = "sendButton" value = "Send Message" />
</div>
</div>
<div class = "row p-1">
<div class = "col-6">
<hr />
</div>
</div>
<div class = "row p-1">
<div class = "col-6">
<ul id = "messagesList"></ul>
</div>
</div>
</div>
<script src=https://cdnjs.cloudflare.com/ajax/libs/microsoft-signalr/6.0.1/signalr.js></script>
<script src = "Scripts/Chat.js"></script>
</body>
</html>
Моя основная программа asp.net.cs:
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddSignalR();
// Add services to the container.
builder.Services.AddControllersWithViews();
builder.Services.AddCors(options =>
{
options.AddDefaultPolicy(
builder =>
{
builder.WithOrigins(https://localhost:44330)
.AllowAnyHeader()
.WithMethods("GET", "POST")
.AllowCredentials();
});
});
var app = builder.Build();
// Configure the HTTP request pipeline.
if (!app.Environment.IsDevelopment())
{
app.UseExceptionHandler("/Home/Error");
// The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts.
app.UseHsts();
}
app.UseHttpsRedirection();
app.UseStaticFiles();
app.UseRouting();
app.UseAuthorization();
app.UseCors();
app.MapControllerRoute(
name: "default",
pattern: "{controller=Home}/{action=Index}/{id?}");
app.MapHub<ChatHub>("/chatHub");
app.Run();
Ядро asp.net ChatHub.cs:
public class ChatHub : Hub
{
public async Task SendMessage(string user, string message)
{
await Clients.All.SendAsync("ReceiveMessage", user, message);
}
}
После запуска программы signalR можно правильно связать:
: Если вы хотите использовать версию signalR для .NET Framework на клиенте и версию signalR для .NET Core на сервере, возникнет несовместимость. Подробную информацию можно найти в этом документе.Learn.microsoft.com/en-us/aspnet/core/signalr/… Таким образом, вы можете использовать версию signalR для .NET Core на клиенте, чтобы обеспечить согласованность версий.
Спасибо, верно, вчера я читал документацию и узнал об этом. Сейчас я использую версию .NET Core, и она работает нормально.
Спасибо за Ваш ответ. Я не тестировал его, но вижу, что на стороне клиента вы используете версию SignalR для .NET Core, хотя это приложение Webforms. Мне интересно, будет ли он работать, но я бы предпочел использовать версию .NET Framework.