Asp.net mvc 4 断开客户端与服务器端信号器的连接
我将Signalr1与MVC4 C#web应用程序一起使用,并使用表单身份验证。 我的布局页面中有一个JavaScript代码: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
$(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