是否可以通过HubCallerContext获取呼叫者的IP地址?或者我是否必须通过HttpContext.Current ... ServerVariables来获取它?
我正在使用SignalR 2.0.在我的VS 2012本地运行时,一切正常.但是当我在IIS上发布网站时,它会中断.该站点加载但其中一个脚本返回404 Not Found.脚本是这样的.
这条道路确实不存在.正确的路径应该是:
https://example.com / private/signalr/negotiate?xxx
请注意粗体部分.
在WebSite(https://example.com/)中,我有另一个应用程序(https://example.com/private/).这个是使用SignalR.
这似乎是SignalR中的一个错误,因为信号器/集线器路径可以从我的私人站点访问.
我有我的服务器控制台应用:
static void Main(string[] args)
{
string url = "http://localhost:8080";
using (WebApp.Start(url))
{
MyHub hub = new MyHub();
Console.WriteLine("Server running on {0}", url);
var key = Console.ReadLine();
while (key != "quit")
{
hub.Send("Server", key);
}
}
}
public class MyHub : Hub
{
public void Send(string name, string message)
{
var context = GlobalHost.ConnectionManager.GetHubContext<MyHub>();
context.Clients.All.addMessage(name, message);
}
}
public class Startup
{
public void Configuration(IAppBuilder app)
{
app.UseCors(CorsOptions.AllowAll);
app.MapSignalR();
}
}
Run Code Online (Sandbox Code Playgroud)
我的.NET客户端应用程序
static void Main(string[] args)
{
MainAsync().Wait();
Console.ReadLine();
} …Run Code Online (Sandbox Code Playgroud) 我是SignalR的新手,但我很好奇它是多么安全.
例如,我创建了以下方法来向所有用户发送消息,如下所示:
public class NotificationHub : Hub
{
public void Send(string message)
{
Clients.All.broadcastMessage(message);
}
}
Run Code Online (Sandbox Code Playgroud)
SignalR在js文件(集线器)中生成以下方法:
proxies.notificationHub.server = {
send: function (message) {
return proxies.notificationHub.invoke.apply(proxies.notificationHub, $.merge(["Send"], $.makeArray(arguments)));
}
};
Run Code Online (Sandbox Code Playgroud)
那么,世界上的任何用户都不能将其复制并粘贴到他们的控制台中,并且在没有我说出的情况下向所有用户发送他们选择的消息?
var notifications = $.connection.notificationHub;
notifications.server.send("Your site has been hacked!");
Run Code Online (Sandbox Code Playgroud)
我只是尝试了这个并且它有效 - 所以,我怎样才能阻止我的用户从客户端发送未经授权的消息?
我是.Net和SignalR的新手.我正在查看一位前同事编写的一些代码,他将此行添加到Route Config,现在正在抛出错误,说它已过时,但我读过的所有文档都建议以这种方式映射连接.
namespace FailureInvestigationToolbox {
public class RouteConfig {
public static void RegisterRoutes( RouteCollection routes ) {
routes.IgnoreRoute( "{resource}.axd/{*pathInfo}" );
routes.MapRoute(
name :"Default",
url :"{controller}/{action}/{id}",
defaults :new {
controller = "fit",
action = "Index",
id = UrlParameter.Optional
}
);
RouteTable.Routes.MapConnection<TaskListPersistence>("taskpersist", "/taskpersist");
}
}
}
Run Code Online (Sandbox Code Playgroud)
错误是:
System.Web.Routing.SignalRRouteExtensions.MapConnection<T>
(System.Web.Routing.RouteCollection, string, string)' is obsolete:
'Use IAppBuilder.MapSignalR<TConnection> in an Owin Startup class. See
http://go.microsoft.com/fwlink/?LinkId=320578 for more details.'
C:\fit\FailureInvestigationToolbox\App_Start\RouteConfig.cs
Run Code Online (Sandbox Code Playgroud)
有可能我的SignalR安装有问题,或者是IAppBuilder的方式来映射我应该做的事情......如果是这样的话?
我使用的是SignalR 2.0.3
我有一个Web应用程序,它在仪表板上有很少的图表.图表的数据在客户端的document.ready函数上获取,调用WCF服务方法.
我想要的是现在在我的应用程序中使用SignalR.我是SignalR的新手.我如何从SignalR Hub调用WCF方法,或者你可以说是不是从服务器提取数据而是希望WCF服务每隔一分钟将数据推送到客户端.
signalR和WCF服务之间是否存在通信方式.
另一种方法可以是强制客户端每分钟从WCF服务请求数据.
任何帮助将非常感激.
我已经做了以下的事情.
我的仪表板页面上的客户端功能
<script src="Scripts/jquery.signalR-2.0.3.min.js"></script>
<!--Reference the autogenerated SignalR hub script. -->
<script src="/signalr/hubs"></script>
<a id="refresh">Refresh</a>
$(function() {
var dashboardHubProxy = $.connection.dashboardHub;
$.connection.hub.start().done(function() {
// dashboardHubProxy.server.refreshClient(parameters);
$("#refresh").click(function() {
dashboardHubProxy.server.refreshClient(parameters);
});
});
dashboardHubProxy.client.refreshChart = function (chartData) {
debugger;
DrawChart(chartData, 'Hourly Call Count For Last ' + Duration + ' Days', '#chartHourly', 'StackedAreaChart');
};
});
Run Code Online (Sandbox Code Playgroud)
我的Dashboard Hub类如下
public class DashboardHub : Hub
{
private readonly ReportService ReportService = new ReportService();
public void RefreshClient(string parameters)
{
var chartData …Run Code Online (Sandbox Code Playgroud) 我正在使用ASP.NET MVC 4和SignalR 2.1.1.我的网站适用于所有浏览器中的大多数用户,但只有特定isp网络上的特定用户才会出现错误.
错误是这样的:
The connection to ws://domain.com/signalr/connect?transport=webSockets&clientProtocol=1.4&connectionToken=78ZpJ007jmlLSBbVzDVbfpYahHsveD3x8%2Bc5PC9h%2FgeOz5zNgE8SaKWaQAasGNLe%2BvJeI6ux6IqW0E8WQWqP6Ps%2FXjc8WPbG7G47oHSxRSx7nVj0leVa1DdXzEXnLQ%2BA&connectionData=%5B%7B%22name%22%3A%22homehub%22%7D%5D&tid=4 was interrupted while the page was loading.
Run Code Online (Sandbox Code Playgroud)
对于收到此错误的相同用户,使用其他网络(同一浏览器/计算机/手机)登录Internet可解决此问题.
到目前为止,我只看到有关此错误的问题,将问题指向浏览器,但在我的情况下,使用具有不同网络的相同浏览器可以解决问题.
任何人都知道如何解决这个问题吗?
更新1: 我注意到客户端方法确实有效,这是服务器方法不起作用.
我是什么意思?:
我有一个在线用户列表,当用户进入和退出网站时,会调用更新用户名列表的信号器客户端方法:
hub.client.addOnlineMember = function (member) {
var newMember = addMember(member);
memberList.append(newMember);
};
hub.client.removeOnlineMember = function (member) {
var newMemberId = '#' + member;
$(memberListName + ' ' + newMemberId).remove();
};
Run Code Online (Sandbox Code Playgroud)
但是,当尝试从服务器加载消息时,它的功能不起作用:
$('#LoadMore').click(function () {
hub.server.loadTopics(page);
});
Run Code Online (Sandbox Code Playgroud)
更新2: 我添加了日志记录:
$.connection.hub.logging = true;
Run Code Online (Sandbox Code Playgroud)
以下是调查结果:
The connection to ws://domain.com/signalr/connect?transport=webSockets&clientProtocol=1.4&connectionToken=rR8%2BSK%2BC%2FtuzPqIGKgPrUNORzBz2kP0WUmXJsURP70Zsj6RK1fOi5tUN1UGEQPntGwoEvwinMkPCXRTyliLwzfLoOBl%2BkCWoBAkAqIFYaDVk3X1MG8dQERl8Or%2F4%2Filp&connectionData=%5B%7B%22name%22%3A%22hub%22%7D%5D&tid=6 was interrupted while the page was loading. jquery.signalr-2.1.1.min.js:8
Synchronous XMLHttpRequest on the …Run Code Online (Sandbox Code Playgroud) 好吧,我继续使用我的Phonegap应用程序开发处于两难境地:对于实时事件通知,我应该使用Azure Notification Hub还是SignalR?
据我了解,SignalR通过使用Web套接字适用于实时Web应用程序.而通知中心可以轻松地跨多个平台发送推送通知.为了便于回复,让我解释一下我目前拥有的结构以及我的应用程序应该做什么.
应用程序:它基本上是一个用户可以创建组并邀请其他用户的应用程序.用户还可以使组"在线",以便其他用户可以"输入"该组.当该群组在线且用户已进入时,他们可以发送问题,交换消息等.
需求:当用户在组中提问或进入/离开组时,其他用户需要在应用屏幕中看到新用户.我可以在服务器上进行轮询以检查并根据更新UI,但这是现代人不允许的.我对这个主题的搜索引出了两件事:SignalR和NotificationHub.
当前架构:客户端 - >带有backbone.js的PhoneGap应用程序.后端 - >带有实体框架和Azure Sql Server的Asp.NET Web API.
我已经考虑过使用通知集线器和标签了.例如,当用户进入在线组时,它向服务器发送请求以注册"grouplisten:{groupId}"标签.然后,服务器将标记注册到用户的设备,并向标记为"grouplisten:{groupId}"的所有其他设备发出通知,以便其他用户使用最近加入的用户更新UI.此外,当用户离开组时,它向服务器发送请求以删除"grouplisten:{groupId}"标签,并且还通知具有"grouplisten:{groupId}"的设备.但是通过这个简单的例子,看起来这样会变得无法管理.
我正在使用SignalR在非常特定的网络条件下(一个疯狂的代理).所以套接字根本不起作用,我必须使用长轮询.当我刷新页面时,它似乎工作了一段时间,但第一次Disconnect发生了.我正在尝试自动重新连接断开连接的事件和以下模式:
这种行为似乎很奇怪.我能做些什么来改善它吗?
我已经阅读了这些主题:
如何在Android Android Client中使用SignalR
但是.net客户端从SignalR服务器获取数据
我用Android编写了一个与SignalR配合使用的简单聊天系统.
它应该是客户端发送消息(通过SendMessage在服务器上调用方法),服务器应该NewMessage在客户端上调用该方法.
这是我ChatHub用C#编写的类(简化).
public class ChatHub : Hub
{
// Store the clients connections Id
static readonly List<string> _connectedClients;
public override Task OnConnected()
{
// Keep connections id
// This section works fine and when the android device connects to the server,
// Its connection id will stored.
_connectedClients.Add(Context.ConnectionId)
//... other codes
}
public void SendMessage(string message)
{
foreach (var connectionId in _connectedClients)
{
// according to the …Run Code Online (Sandbox Code Playgroud)