基本冲突.
SignalR希望Newtonsoft.Json版本4.0.7或更高版本,而RavenDB希望版本等于4.0.5.这显然意味着它们不能并排安装.
因此,除了从其中一个中下载源代码并获取本地的依赖关系然后必须检查从中创建的二进制文件,是否有可能保持使用NuGet管理的依赖项,并且可能只是转发DLL调用(像Mvc那样每个新版本都有)?
我想在服务器上的所有连接客户端上执行一个方法,当前客户端除外.没有我维护自己的clientids列表的任何方式吗?
TIA!
这个问题与另一个线程有关,您可以在这里阅读:使用SignalR 进行表单身份验证,我在用户dfowler的帮助和耐心下尝试了解如何强制在SignalR Hub上形成ASP .NET Forms身份验证.
问题描述:我希望只有经过身份验证的用户才能连接SignalR Hub并接收/发送消息.
入侵场景:入侵者可以捕获/访问访问客户端计算机上临时文件的网页的HTML和Javascripts.因此,该入侵者可以知道建立/使用与Hub的连接所需的所有细节(方法,集线器名称等).dfowler提出的解决方案是实现IConnect:
您将实现IConnected并在Connect if(!Context.User.Identity.IsAuthenticated)中抛出以下代码抛出新的异常("GTFO");
所以我试着用这样的东西
public System.Threading.Tasks.Task Connect()
{
if (!Context.User.Identity.IsAuthenticated
|| !(Context.User.IsInRole("role1") || Context.User.IsInRole("role2")
))
throw new Exception("User not authorized");
return null;
}
Run Code Online (Sandbox Code Playgroud)
一旦经过测试,问题在于,当调用Connect方法时,连接已经建立并且普通抛出异常将无济于事(如果我得到了正确的实际连接应该用于在连接时向客户端发送消息)抛出异常只会产生一条未发送的欢迎消息).
事实上,从我的测试中,客户端仍然可以读取所有消息(并发送它们).
现在,我想到的方法:
还有其他方法吗?任何方式终止服务器端的连接或应该接受唯一真正的身份验证是主机网页之一(打开所有signalR客户端攻击的大门?)
编辑
以下是我使用IConnect.Connect无条件抛出异常的方法(浏览器IE9)时客户端 - 服务器通信的顺序:

它看起来像foreverFrame失败但是longPolling回退正在建立并且仍然有效 - 这是在抛出Javascript中捕获的错误之后
if (connection.state === signalR.connectionState.connecting) {
// Connection hasn't been started yet
throw "SignalR: Connection has not …Run Code Online (Sandbox Code Playgroud) 我正在开发一个使用SignalR的用户跟踪解决方案,作为学习SignalR的有趣项目,用于ASP.NET MVC应用程序.
目前,我可以跟踪已记录的用户以及他们在特定页面上的时长.如果他们移动到另一个页面,我也跟踪它并且SignalR正在更新的计时器重置...许多其他功能被实现或部分实现.
我面临的问题是如何在SignalR集线器内获得完整的URL控制器/动作/参数?
当我使用HttpContext.Current.Request.Urlurl时总是/ signalr/connect.
注意:
var hub = $.connection.myHub;
$.connection.hub.start();
Run Code Online (Sandbox Code Playgroud)
在_Layout.cshtml中.
更新:
我试过用
var location = '@HttpContext.Current.Request.Url';
var hub = $.connection.myHub;
$.connection.hub.start().done(function () {
hub.setLocation(location);
});
Run Code Online (Sandbox Code Playgroud)
并且位置正确传递但我不需要在Connect()任务上使用它.是否有可能做到这一点?
更新2:
这种方法不起作用
var hub = $.connection.myHub;
$.connection.hub.start(function(){hub.setLocation(location)});
Run Code Online (Sandbox Code Playgroud)
就像Connect()之前所说的那样.
在我的中心我有几种方法,但我想传递一个值(在我的情况下是一个位置)Connect(),这可能吗?
public class MyHub : Hub, IDisconnect, IConnected
{
public Task Connect()
{
//do stuff here
//and i would like to have the **location** value
}
public Task Disconnect()
{
//do stuff here
}
} …Run Code Online (Sandbox Code Playgroud) 我正在尝试用SignalR组建一个简单的"Hello World"样式应用程序.稍微复杂的因素是SignalR集线器需要自托管,而不是IIS/ASP.NET.据我所知,我已经让服务器端正常工作,并且它可以在端口8080上使用,但我在连接客户端时遇到了麻烦.我目前遇到的问题是SignalR客户端似乎忽略了我指定的URL上的端口.
具体来说,我在这里有这个代码:
<head runat="server">
<script type="text/javascript" src="/Scripts/jquery-1.8.2.min.js"></script>
<script type="text/javascript" src="/Scripts/json2.min.js"></script>
<script type="text/javascript" src="/Scripts/jquery.signalR-0.5.3.js"></script>
<script type="text/javascript" src="http://<%=Request.Url.Host %>:8080/signalr/hubs"></script>
<title>SignalR Test</title>
</head>
<body>
<script type="text/javascript">
$(function () {
// Wire up the client to the SignalR server on the same host
// as the source of this page, but on port 8080.
$.connection.url = "http://<%=Request.Url.Host %>:8080/signalr";
var roomHub = $.connection.roomHub;
$('#echoButton').click(function () {
roomHub.echo($('#echoButton').val())
.error(function (err) {
alert(err);
});
});
$.connection.hub.start({ transport: 'auto', xdomain: true })
.done(function () {
console.log('Connected.');
}) …Run Code Online (Sandbox Code Playgroud) 我安装了Microsoft.AspNet.SignalR.Utils版本1.1.0.0,然后使用signalr.exe ipc安装性能计数器.
在"信号器"类别下的性能监视器中,我可以看到所有性能计数器,但它没有说明实例......所以如果我在监视器中添加其中一个计数器,它们就不会出现.
我的信号服务器服务器作为asp.net web api托管在IIS上.服务器和客户端都使用相同版本的信号器,即1.1.0.0.
任何的想法?
我使用基于SignalR(jquery.signalR-2.0.0-beta2.js)的实时消息系统开发了一个asp.net mvc应用程序.问题是SignalR连接启动后无法加载所有部分视图.在这种情况下,$ .connection.hub.start({transport:'longPolling'})之后的所有ajax请求.done(function(){applicationHub.server.connectUser();})保持挂起状态.是否可以将此请求设为异步,或者它是SignalR中的错误?谢谢你的帮助!
SignalR电话:
<script type="text/javascript">
$(document).ajaxStop(function () {
var applicationHub = $.connection.applicationHub;
if ($.connection.hub && $.connection.hub.state == $.signalR.connectionState.disconnected) {
registerConversationClientMethods(applicationHub);
$.connection.hub.start({ transport: 'longPolling'}).done(function () {
applicationHub.server.connectUser();
})
.fail(function () {
});
}
});
</script>
Run Code Online (Sandbox Code Playgroud)
呈现局部视图的Ajax调用:
function LoadActivities(id,type,container,action,loaderpath){
var url = action + '/?id=' + id + '&type=' + type;
var targetDiv = container;
var ajaxLoading = "<img id='ajax-loader' src='" + loaderpath + "' height='6' width='50' style='margin:5px;'>";
$(targetDiv).html("<div align='center'>" + ajaxLoading + "</div>");
$.get(url, null, function (result) {
$(targetDiv).html(result);
}); …Run Code Online (Sandbox Code Playgroud) 我使用ASP.Net MVC 5,我有一个长期运行的动作,它必须轮询webservices,处理数据并将它们存储在数据库中.
为此,我想使用TPL库来启动任务异步.
但我想知道如何做三件事:
我对所涉及的所有技术了解不少.但我不确定实现这一目标的最佳方法.
有人可以帮我解决最佳解决方案吗?
我们目前正在开发基于vue-cli webpack模板的投票应用程序.由于我们希望以一致且可维护的方式存储和操纵我们的投票状态,因此我们打算使用vuex进行状态管理.前端和后端之间的交互基于websockets,我们希望使用signalr,因为它在之前的项目中已被证明非常好.由于我们是vue.js的新手,我们需要一些建议如何将signalr,vuex和vue.js完美地集成在一起.
我们来描述一下这个场景:
前端从我们的后端获得一个事件来识别投票民意调查是否有效并且可以接收所选答案.一段时间后,我们通知前端结果可用并将其显示给用户.在某些情况下,我们可能会进行另一次投票.重要的是,我们能够在文档被隐藏时断开连接(页面可见性api).
我们的解决方案:
一般来说,我想为此目的实现一个特殊的signal.service.该服务负责建立连接以及通过websockets发送和接收消息.由于我们无法从公共模块对vuex存储执行任何更改,因此我们发现vuex插件是合适的.vuex插件应该包装signalr.
如果我们收到VotingStartEvent,我们将解锁相应的问题并将其显示给用户.如果用户回答了该问题,我们将此问题的新状态(已回答)提交给vuex商店.在我们的插件中,我们订阅了突变,我们将使用此订阅将我们的投票发送到后端.以下片段说明了这个想法:
var plugin = (store) => {
// ...
store.subscribe((mutation, state) => {
console.log('inside subscription');
// if vote has answered state, call connection.send() to submit the message to the backend
});
connection.received((message) => {
// ...
var event = parseEvent(message);
if (event.type === START) {
store.commit({type: 'voting', item: 'unlocked'});
}
// ...
});
}
Run Code Online (Sandbox Code Playgroud)
这种方法是好的还是你认为还有改进的余地?
我今天一直在尝试使用SignalR,它非常整洁.基本上我想要实现的目标如下:
一旦设备连接,它应该向第一个发送消息.如果有超过1个连接的设备,我想发送两条消息.除最后连接的客户端之外的所有人.并且仅向最后连接的客户端发送一条消息.
当我将它放在自定义API控制器中并且基本上调用动作时,我一直使用的代码非常完美,但这不是我想要的.
我想在OnConnected没有任何用户交互的情况下在设备连接时立即发送消息,但是当我将代码放在OnConnected覆盖内时它会停止工作.它不再发送给特定客户端(首先连接和最后连接).
我希望有人能够帮助我解决这个问题,因为我现在已经敲了几个小时.
public override System.Threading.Tasks.Task OnConnected()
{
UserHandler.ConnectedIds.Add(Context.ConnectionId, UserHandler.ConnectedIds.Count + 1);
int amountOfConnections = UserHandler.ConnectedIds.Count;
var lastConnection = UserHandler.ConnectedIds.OrderBy(x => x.Value).LastOrDefault();
var allExceptLast = UserHandler.ConnectedIds.Take(amountOfConnections - 1).Select(x => x.Key).ToList();
if (amountOfConnections == 1)
{
Clients.Client(UserHandler.ConnectedIds.First().Key).hello("Send to only(also first) one");
}
else
{
Clients.Clients(allExceptLast).hello("Send to everyone except last");
Clients.Client(lastConnection.Key).hello("Send to only the last one");
}
return base.OnConnected();
}
Run Code Online (Sandbox Code Playgroud) signalr ×10
asp.net ×3
signalr-hub ×3
asp.net-mvc ×2
javascript ×2
c# ×1
c#-5.0 ×1
jquery ×1
nuget ×1
ravendb ×1
vue.js ×1
vuex ×1