signalr是否适用于HTTPS?
我在ssl上有一个站点,我想使用SignalR是否有可能?
如果是这样,我是否需要编写不同的/添加配置?
是否可以在服务堆栈项目中使用SignalR?我们目前正在为REST Web API使用服务堆栈.我们总体上对它的架构,灵活性等感到高兴.现在我们正在探索使用事件驱动或推送技术(与状态轮询相比)与我们的呼叫客户端进行通信的方法.我应该注意到,我们目前使用AppHostHttpListenerBase(在IIS内部托管)在Windows服务中托管我们的API.
是否有可能配置一个专门的路由,以某种方式传递给SignalR Hub,所以这两个可以并存?例如,它http://localhost:8000/api/live/jobs/jobid会击中SignalR代码,但http://localhost:8000/api/jobs/jobid会路由到当前基于DTO的服务堆栈代码.
PS - 我们希望继续以自主模式托管,因为我们喜欢移植到Mono并在Linux上运行的灵活性(与IIS绑定).
我试图让一个超级简单的集线器连接跨域工作,但没有运气.我已经阅读了几十篇文章并完成了所有提到但仍然没有成功的帖子.
我的服务器中心在这里
public class ChatHub : Hub
{
public void Send(string name, string message)
{
Clients.All.broadcastMessage(name, message);
}
}
Run Code Online (Sandbox Code Playgroud)
我的服务器MapHubs调用在这里
RouteTable.Routes.MapHubs(new HubConfiguration { EnableCrossDomain = true });
Run Code Online (Sandbox Code Playgroud)
我的任何javascript客户端都在这里
<!DOCTYPE html>
<html>
<head>
<meta name="viewport" content="width=device-width" />
<title>Index</title>
<script src="~/Scripts/jquery-2.0.1.min.js"></script>
<script src="~/Scripts/jquery.signalR-1.1.2.min.js"></script>
<script src="/signalr/hubs"></script>
</head>
<body>
<div class="container">
<input type="text" id="displayname" value="Test" />
<input type="text" id="message" value="I'm here" />
<input type="button" id="sendmessage" value="Send" />
</div>
<script type="text/javascript">
$(function ()
{
$.connection.hub.url = 'http://<my url>/';
var chat = $.connection.chatHub;
alert(chat);
$.connection.hub.start().done(function () …Run Code Online (Sandbox Code Playgroud) SignalR上有一个很好的教程,解释了如何将.NET对象作为参数传递给Javascript,反之亦然.在这种情况下,它传递一个ChatMessage对象.
但是,该教程解决了一个非常简单的对象.我想看看如何在Javascript中处理复杂的.NET对象(其他对象作为属性).
例如,请考虑以下对象:
class Master {
public List<QuarterHour> QuarterHours { get; set; }
public List<string> Books { get; set; }
public int EndDay { get; set; }
public int StartDay { get; set; }
}
class QuarterHour {
public MinuteInstance Minute {get; set;}
public int HourStart { get; set;}
}
class MinuteInstance {
public bool Registered {get; set;}
public int NumAttendees {get; set;}
}
Run Code Online (Sandbox Code Playgroud)
在.NET中,我可以引用这样的值:master.QuarterHours[2].Minute.Registered.我的问题:
master.QuarterHours[2].Minute.Registered在Javascript端接收方法中引用?Master在Javascript中构建对象以发送到.NET端?界面中可用的On和Subscribe方法之间有什么区别IHubProxy.何时应该使用一个而不是另一个
我刚刚发现你无法访问SignalR Hub中的当前会话.
简化我的场景:我试过写聊天.
当前用户的名称保留在会话中.
我已经使用SignalR来更新(一组连接)每个新消息.
现在我看到我无法通过集线器访问当前用户的名称.
我想可能会有一些变通方法,但是我的设计是错误的吗?
我不应该为此目的使用SignalR吗?或者我不应该Session以这种方式使用?
我正在使用SignalR,ASP.NET和C#开发实时客户端 - 服务器应用程序.我使用localhost作为主机和VS2013.
我的问题是:
为什么我关闭服务器,在Web客户端上发生" 重新连接 "事件?
"断开"事件仅在40秒以后发生.如何减少这个时间?
我需要客户端在启动时连接到服务器."重新连接"事件应仅在固定间隔内发生.如果"重新连接"间隔时间结束,则客户端应作为新客户端连接.如何归档这个目标?
最后,我想问一下-如何永葆使用连接SignalR在正确的方式?
我正在使用此代码:
C#
public override Task OnDisconnected()
{
clientList.RemoveAt(nIndex);
Console.WriteLine("Disconnected {0}\n", Context.ConnectionId);
return (base.OnDisconnected());
}
public override Task OnReconnected()
{
Console.WriteLine("Reconnected {0}\n", Context.ConnectionId);
return (base.OnReconnected());
}
Run Code Online (Sandbox Code Playgroud)
使用Javascript
$.connection.hub.reconnected(function () {
// Html encode display name and message.
var encodedName = $('<div />').text("heartbeat").html();
var now = new Date();
// Add the message to the page.
$('#discussion').append('Reconnected to server: ' + …Run Code Online (Sandbox Code Playgroud) 我有一个完整的ASP.NET MVC应用程序(.NET Core, ASP.NET MVC 6).
我现在想signalr在我的应用程序中添加一个.所有样品MVC用signalr?
我正在尝试改进我的应用程序,这将需要从C#而不是javascript调用集线器.在我的应用中添加任务的当前工作流程是:
我想做的是绕过从我的AngularJS控制器调用hub的方法,并直接从我的API控制器方法调用它.
这就是我的中心目前的样子:
public class TaskHub : Hub
{
public void InsertTask(TaskViewModel task)
{
Clients.Caller.onInsertTask(task, false);
Clients.Others.onInsertTask(task, true);
}
}
Run Code Online (Sandbox Code Playgroud)
关于这个主题有很多SO线程,但我读过的所有内容都会让我在API控制器中添加以下代码:
var hubContext = GlobalHost.ConnectionManager.GetHubContext<TaskHub>();
hubContext.Clients.All.onInsertTask(task);
Run Code Online (Sandbox Code Playgroud)
这有很多问题.首先,我希望客户端广播调用存在于单个类中,而不是直接从我的API控制器调用.其次,hubContext是一个实例,IHubContext而不是IHubCallerConnectionContext.这意味着我只能访问所有客户端,无法广播不同的响应Caller,Others就像我现在正在做的那样.
有没有办法真正从C#调用集线器的方法,理想情况下,可以访问不同的调用方选项?理想情况下,我可以从我的API控制器(或者更好的DI解决方案)中执行以下操作:
var taskHub = new TaskHub();
taskHub.InsertTask(task);
Run Code Online (Sandbox Code Playgroud)
提前致谢.
解
对于后代,根据Wasp的建议,我认为我会包含完整的解决方案.
首先,我修改了我的javascript(AngularJS)服务,将SignalR连接ID包含在API调用的自定义请求标头中,在本例中为INSERT:
var addTask = function (task) {
var config = {
headers: { 'ConnectionId': connection.id }
};
return $http.post('/api/tasks', task, config);
};
Run Code Online (Sandbox Code Playgroud)
然后,在执行适用的CRUD操作后,我从API控制器中的请求中检索了连接ID,然后调用了我的集线器:
public HttpResponseMessage Post(HttpRequestMessage request, …Run Code Online (Sandbox Code Playgroud) 我在MVC5项目中使用SignalR 2.2.0.SignalR依赖于客户端的JQuery.
JQuery最近发布了新版本,我从Nuget更新了它,特别是从2.2.4升级到3.0.0.1,但是SignalR停止了工作.javascript中的启动命令"$ .connection.hub"失败.经过长时间的努力,我将JQuery降级到2.2.4并且一切都很好.
我是唯一一个遇到这个问题的人吗?有什么解决方法吗?
谢谢.
signalr ×10
c# ×5
javascript ×2
asp.net ×1
asp.net-core ×1
asp.net-mvc ×1
cross-domain ×1
https ×1
jquery ×1
json ×1
servicestack ×1
signalr-hub ×1
web ×1
webserver ×1