Asp.net mvc 4 断开客户端与服务器端信号器的连接

Asp.net mvc 4 断开客户端与服务器端信号器的连接,asp.net-mvc-4,signalr,Asp.net Mvc 4,Signalr,我将Signalr1与MVC4 C#web应用程序一起使用,并使用表单身份验证。 我的布局页面中有一个JavaScript代码: $(documnet).ready(function(){ connect to hub code ... }) 我想断开用户与集线器的连接,并在用户登录并验证ok后再次开始连接。 我想在我的帐户控制器和方法中从服务器端执行此操作: public ActionResult LogOn(LoginModel model, string returnUrl

我将Signalr1与MVC4 C#web应用程序一起使用,并使用表单身份验证。 我的布局页面中有一个JavaScript代码:

$(documnet).ready(function(){
       connect to hub code ...
})
我想断开用户与集线器的连接,并在用户登录并验证ok后再次开始连接。 我想在我的帐户控制器和方法中从服务器端执行此操作:

public ActionResult LogOn(LoginModel model, string returnUrl)
{
    if (ModelState.IsValid)
    {
        if (System.Web.Security.Membership.ValidateUser(model.UserName, model.Password))
        {
            FormsAuthentication.SetAuthCookie(model.UserName, false);
            ....here , disconnect from hub
            ....to make the user reconnect     
}
我之所以要这样做,是因为如果用户在登录后更改为authenticated,并且连接保持不变,那么Signaler会抛出一个错误。错误是:

连接id的格式不正确


无法从服务器停止和启动信号器连接。你需要打电话

$.connection.hub.stop(); //on the client before the user attempts to log on and then call 
$.connection.hub.start(); //after the log on attempt has completed.

一种方法是在客户机上编写一个断开连接事件,服务器可以通过Signaler调用该事件。也许有点像这样:

myHub.client.serverOrderedDisconnect = function (value) {
    $.connection.hub.stop();
};
Clients.Client(Context.ConnectionId).serverOrderedDisconnect();
然后,在服务器上,类似以下内容:

myHub.client.serverOrderedDisconnect = function (value) {
    $.connection.hub.stop();
};
Clients.Client(Context.ConnectionId).serverOrderedDisconnect();
试试这个:

public ActionResult LogOn(LoginModel model, string returnUrl) {
    if (ModelState.IsValid) {
        if (System.Web.Security.Membership.ValidateUser(model.UserName, model.Password)) {
            FormsAuthentication.SetAuthCookie(model.UserName, false);
            connection.Stop();
        }
}

假设您的连接句柄是
连接
。挑战在于访问Action方法中的
连接
对象的句柄。

尝试控制javascript中的所有内容。下面是一个注销示例,登录与此类似

发件人:

如果用户的身份验证状态在活动连接期间发生更改 存在时,用户将收到一个错误,该错误说明“用户标识” 在活动信号器连接期间无法更改。“在这种情况下,您的 应用程序应重新连接到服务器,以确保 连接id和用户名是协调的。例如,如果您的 应用程序允许用户在活动连接时注销 存在,则连接的用户名将不再与名称匹配 这是为下一个请求传递的。你会想阻止这一切的 在用户注销之前进行连接,然后重新启动它

但是,需要注意的是,大多数应用程序不需要 手动停止和启动连接。如果你的申请 在注销后将用户重定向到单独的页面,例如 Web窗体应用程序或MVC应用程序中的默认行为,或 注销后刷新当前页面,激活的连接将被删除 自动断开连接,无需任何其他操作

下面的示例显示了在以下情况下如何停止和启动连接: 用户状态已更改


$(函数(){
var chat=$.connection.sampleHub;
$.connection.hub.start().done(函数(){
$(“#注销按钮”)。单击(函数(){
chat.connection.stop();
$.ajax({
url:“Services/SampleWebService.svc/LogOut”,
类型:“职位”
}).done(函数(){
chat.connection.start();
});
});
});
});

将以下功能复制并粘贴到集线器中

Use HttpContext.Current.Response.End();

如果仍有人在寻找解决方案(SignalR版本2.4.1),则要强制客户端断开集线器中的连接

GlobalHost.DependencyResolver.Resolve().GetConnections().First(c=>c.ConnectionId==“YourId”).Disconnect();

您可以在.Net Core中直接使用hub上下文中止()连接

Context.Abort();
请参见下面的方法


但是如何从“登录”操作中的服务器端代码获取Context.ConnectionId?但是如何从“登录”操作中的服务器端代码获取“连接”对象?好问题。我不认为这件事很好。除非您将其添加到会话中,否则它可能不可用,这似乎是错误的…我在每个文档就绪状态下调用“$.connectino.hub.start();”。之前调用“$.connection.hub.stop();”可以吗?当用户连接到中心时,您必须从客户端获取它,并将其存储起来,以便能够将其与任何新连接进行比较,这也将防止模拟攻击。如果员工刚刚被解雇,他们需要撤销访问权限,会发生什么情况?我需要能够断开任何打开的信号器会话。一定有办法。除了语法和演示问题之外,这个解决方案是否有任何技术问题会导致否决票?您如何在aspnetcore中做到这一点?对不起,我只使用了asp.net