从服务器端signalr断开客户端(disconnect client from server si

2019-08-20 11:52发布

我使用SignalR 1与形式的认证MVC4 C#的Web应用程序。 我在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是格式不正确。

Answer 1:

你不能停止,并开始从服务器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.


Answer 2:

你可以做什么你问的一种方式是客户端,服务器可以通过SignalR呼吁编写断开事件。 也许有些事情是这样的:

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

然后,在服务器上,这样的事情:

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


Answer 3:

尝试控制一切从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();
            });
        });
    });
});



Answer 4:

试试这个:

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 。 目前的挑战是访问手柄您connection对象动作方法。



Answer 5:

复制以下函数粘贴到你的集线器

Use HttpContext.Current.Response.End();

强制客户端在集线器断开



文章来源: disconnect client from server side signalr