断开客户端与服务器端信号器

时间:2013-04-08 21:31:13

标签: asp.net-mvc-4 signalr

我正在使用带有表单身份验证的MVC4 C#Web应用程序的SignalR 1。 我在JavaScript的布局页面中有一个代码:

$(documnet).ready(function(){
       connect to hub code ...
})

我想断开用户从集线器断开连接并在登录后再次启动连接并验证确定。 我想在我的帐户控制器和方法中从服务器端执行此操作:

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     
}

我想这样做的原因是,如果用户在登录后更改为经过身份验证并且连接仍然存在,则SignalR会抛出错误。错误是:

  

连接ID的格式不正确。

7 个答案:

答案 0 :(得分:24)

您无法停止并启动来自服务器的SignalR连接。您需要致电

$.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.

答案 1 :(得分:12)

您可以做的一种方法是在客户端上编写一个断开事件,服务器可以通过SignalR调用。也许有点像这样:

myHub.client.serverOrderedDisconnect = function (value) {
    $.connection.hub.stop();
};

然后,在服务器上,像这样:

Clients.Client(Context.ConnectionId).serverOrderedDisconnect();

答案 2 :(得分:4)

尝试从javascript控制所有内容。以下是注销示例,登录类似。

来自http://www.asp.net/signalr/overview/security/introduction-to-security

  

如果用户的身份验证状态在活​​动连接时发生更改   存在,用户将收到一个错误,表明"用户身份   在有效的SignalR连接期间无法更改。"在那种情况下,你的   应用程序应重新连接到服务器以确保   连接ID和用户名是协调的。例如,如果你的   应用程序允许用户在活动连接时注销   存在,连接的用户名将不再与名称匹配   传递给下一个请求。你会想要停止   在用户注销之前连接,然后重新启动它。

     

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

     

以下示例显示了何时停止和启动连接   用户状态已更改。

<script type="text/javascript">
$(function () {
    var chat = $.connection.sampleHub;
    $.connection.hub.start().done(function () {
        $('#logoutbutton').click(function () {
            chat.connection.stop();
            $.ajax({
                url: "Services/SampleWebService.svc/LogOut",
                type: "POST"
            }).done(function () {
                chat.connection.start();
            });
        });
    });
});

答案 3 :(得分:1)

试试这个:

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();
        }
}

假设您的连接句柄为connection。挑战是在Action Method中访问connection对象的句柄。

答案 4 :(得分:1)

如果有人仍在寻找解决方案(SignalR版本2.4.1):

GlobalHost.DependencyResolver.Resolve<ITransportHeartbeat>().GetConnections().First(c => c.ConnectionId == "YourId").Disconnect();

答案 5 :(得分:0)

您可以在集线器上下文中直接在 .Net Core 中 abort() 连接

Context.Abort();

看下面的方法

https://docs.microsoft.com/en-us/dotnet/api/microsoft.aspnetcore.signalr.hubcallercontext.abort

答案 6 :(得分:-3)

将以下功能复制并粘贴到您的Hub

Use HttpContext.Current.Response.End();

强制客户端在集线器中断开连接