SignalR Webform - signalr/hubs 协商问题
SignalR Webform - signalr/hubs Negociate issue
我有一个遗留的 webform 项目,需要在其中集成 signalr 技术
我知道 signalr/hubs 是动态生成的,但是在我的特定项目中我无法让它工作。
我试图加载所有 urls 路径,例如:
<script src="../signalr/hubs"></script>
<script src="~/signalr/hubs"></script>
<%--<script src='<%: ResolveClientUrl("~/signalr/hubs") %>'></script>--%>
为了解决这个问题,我在另一个工作正常的项目中生成了 signalR,我将其复制到我的脚本文件夹 /Scripts/SignalR/Hub.js 并在客户端引用了它。
<script src="../Scripts/SignalR/Hubs.js"></script>
它工作正常,因为我的客户端可以与我的 chatHub(服务器端)建立连接,初始化我的聊天变量,如下所示:
但是在那之后我在服务器到客户端之间的协商过程中出现错误,如下图所示:
我认为是因为当服务器尝试与客户端通信时,它生成 url 作为 [signalr/hub],但正如我之前提到的,我正在使用
/Scripts/SignalR/Hub.js 文件到实例断开与集线器的连接。
如何解决服务器与客户端之间的协商问题?
这是我的结构文件
startup.cs
using System;
using System.Threading.Tasks;
using Microsoft.Owin;
using Owin;
using Microsoft.AspNet.SignalR;
using SistemaJaspion.AppCode;
using System.Web.Routing;
[assembly: OwinStartup(typeof(SistemaJaspion.AppCode.Startup))]
namespace SistemaJaspion.AppCode
{
/// <summary>
/// The server needs to know which URL to intercept and direct to SignalR. To do that we add an OWIN startup class.
/// </summary>
public class Startup
{
public void Configuration(IAppBuilder app)
{
// Any connection or hub wire up and configuration should go here
//app.MapSignalR("/signalr", new HubConfiguration());
//app.MapSignalR();
var hubConfiguration = new HubConfiguration();
hubConfiguration.EnableDetailedErrors = true;
hubConfiguration.EnableJavaScriptProxies = true;
app.MapSignalR("/signalr", hubConfiguration);
}
}
}
ChatHub.cs
using System;
using System.Collections.Generic;
using System.Linq;
using Microsoft.AspNet.SignalR;
using Microsoft.AspNet.SignalR.Hubs;
using System.Web;
using System.Threading;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Authorization;
namespace SistemaJaspion.AppCode
{
/// <summary>
/// The Hub class is used to define methods the clients can call on the server
/// </summary>
///
[HubName("chatHub")]
//[Microsoft.AspNet.SignalR.Authorize]
public class ChatHub : Hub
{
static List<UsuariosSignalR> ConnectedUsers = new List<UsuariosSignalR>();
// Number of connected clients
private static int connectionCount = 0;
public void Send(string name, string message)
{
// Append the current date
name = DateTime.Now.ToString() + " " + name;
// Call the broadcastMessage method to update clients.
Clients.All.broadcastMessage(name, message);
}
public override Task OnConnected()
{
// Increase the number of connections
Interlocked.Increment(ref connectionCount);
// Update the number of the connected users
Clients.All.reportConnections(connectionCount);
return base.OnConnected();
}
public override Task OnDisconnected(bool stopCalled)
{
// Decrease the number of connections
Interlocked.Decrement(ref connectionCount);
// Update the number of the connected users
Clients.All.reportConnections(connectionCount);
return base.OnDisconnected(stopCalled);
}
}
}
MasterPage.aspx
<script src="../Scripts/jquery-1.6.4.min.js"></script>
<script src="../Scripts/jquery.signalR-2.4.1.js"></script>
<script src="../Scripts/SignalR/Hubs.js"></script>
<!--Add script to update the page and send messages.-->
<script type="text/javascript">
$(function () {
/* Peer-to-peer broadcast code */
// Declare a proxy to reference the ChatHub.
debugger;
var chat = $.connection.chatHub;
chat.client.reportConnections = function (count) {
$("#usersCount").text(count);
}
$.connection.hub.logging = true;
$.connection.hub.start();
});
</script>
您可以在startup.cs
的配置函数中检查是否添加了端点
app.UseEndpoints(endpoints =>
{
endpoints.MapControllerRoute(
name: "default",
pattern: "{controller=Home}/{action=Index}/{id?}");
endpoints.MapRazorPages();
endpoints.MapHub<ChartHub>("/charthub");
});
这是我在项目中使用的。
我明白为什么它不起作用。
首先,我对 signalR 的研究(我研究的例子)是基于 WebApplication/webforms 项目,在我的例子中,我是基于 Wesite/webforms 项目,它的结构有点不同他们。
无论如何,归功于 Can SignalR be used with asp.net WebForms?,按照步骤我可以 运行 signalR on website/webform .net 项目。
我有一个遗留的 webform 项目,需要在其中集成 signalr 技术
我知道 signalr/hubs 是动态生成的,但是在我的特定项目中我无法让它工作。
我试图加载所有 urls 路径,例如:
<script src="../signalr/hubs"></script>
<script src="~/signalr/hubs"></script>
<%--<script src='<%: ResolveClientUrl("~/signalr/hubs") %>'></script>--%>
为了解决这个问题,我在另一个工作正常的项目中生成了 signalR,我将其复制到我的脚本文件夹 /Scripts/SignalR/Hub.js 并在客户端引用了它。
<script src="../Scripts/SignalR/Hubs.js"></script>
它工作正常,因为我的客户端可以与我的 chatHub(服务器端)建立连接,初始化我的聊天变量,如下所示:
但是在那之后我在服务器到客户端之间的协商过程中出现错误,如下图所示:
我认为是因为当服务器尝试与客户端通信时,它生成 url 作为 [signalr/hub],但正如我之前提到的,我正在使用 /Scripts/SignalR/Hub.js 文件到实例断开与集线器的连接。
如何解决服务器与客户端之间的协商问题?
这是我的结构文件
startup.cs
using System;
using System.Threading.Tasks;
using Microsoft.Owin;
using Owin;
using Microsoft.AspNet.SignalR;
using SistemaJaspion.AppCode;
using System.Web.Routing;
[assembly: OwinStartup(typeof(SistemaJaspion.AppCode.Startup))]
namespace SistemaJaspion.AppCode
{
/// <summary>
/// The server needs to know which URL to intercept and direct to SignalR. To do that we add an OWIN startup class.
/// </summary>
public class Startup
{
public void Configuration(IAppBuilder app)
{
// Any connection or hub wire up and configuration should go here
//app.MapSignalR("/signalr", new HubConfiguration());
//app.MapSignalR();
var hubConfiguration = new HubConfiguration();
hubConfiguration.EnableDetailedErrors = true;
hubConfiguration.EnableJavaScriptProxies = true;
app.MapSignalR("/signalr", hubConfiguration);
}
}
}
ChatHub.cs
using System;
using System.Collections.Generic;
using System.Linq;
using Microsoft.AspNet.SignalR;
using Microsoft.AspNet.SignalR.Hubs;
using System.Web;
using System.Threading;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Authorization;
namespace SistemaJaspion.AppCode
{
/// <summary>
/// The Hub class is used to define methods the clients can call on the server
/// </summary>
///
[HubName("chatHub")]
//[Microsoft.AspNet.SignalR.Authorize]
public class ChatHub : Hub
{
static List<UsuariosSignalR> ConnectedUsers = new List<UsuariosSignalR>();
// Number of connected clients
private static int connectionCount = 0;
public void Send(string name, string message)
{
// Append the current date
name = DateTime.Now.ToString() + " " + name;
// Call the broadcastMessage method to update clients.
Clients.All.broadcastMessage(name, message);
}
public override Task OnConnected()
{
// Increase the number of connections
Interlocked.Increment(ref connectionCount);
// Update the number of the connected users
Clients.All.reportConnections(connectionCount);
return base.OnConnected();
}
public override Task OnDisconnected(bool stopCalled)
{
// Decrease the number of connections
Interlocked.Decrement(ref connectionCount);
// Update the number of the connected users
Clients.All.reportConnections(connectionCount);
return base.OnDisconnected(stopCalled);
}
}
}
MasterPage.aspx
<script src="../Scripts/jquery-1.6.4.min.js"></script>
<script src="../Scripts/jquery.signalR-2.4.1.js"></script>
<script src="../Scripts/SignalR/Hubs.js"></script>
<!--Add script to update the page and send messages.-->
<script type="text/javascript">
$(function () {
/* Peer-to-peer broadcast code */
// Declare a proxy to reference the ChatHub.
debugger;
var chat = $.connection.chatHub;
chat.client.reportConnections = function (count) {
$("#usersCount").text(count);
}
$.connection.hub.logging = true;
$.connection.hub.start();
});
</script>
您可以在startup.cs
的配置函数中检查是否添加了端点app.UseEndpoints(endpoints =>
{
endpoints.MapControllerRoute(
name: "default",
pattern: "{controller=Home}/{action=Index}/{id?}");
endpoints.MapRazorPages();
endpoints.MapHub<ChartHub>("/charthub");
});
这是我在项目中使用的。
我明白为什么它不起作用。
首先,我对 signalR 的研究(我研究的例子)是基于 WebApplication/webforms 项目,在我的例子中,我是基于 Wesite/webforms 项目,它的结构有点不同他们。
无论如何,归功于 Can SignalR be used with asp.net WebForms?,按照步骤我可以 运行 signalR on website/webform .net 项目。