我可以看到HubConnection中有一个选项可以通过客户端的url请求传递参数.有没有办法通过JS或.NET客户端的http头传递特定的令牌?
我有一些SignalR集线器可能需要访问一些瞬态和单独的依赖项.挂起Hub的创建很容易并且工作正常但是SignalR在创建的Hub上执行自己的Dispose()调用,而不是通知依赖解析器并让它参与处理.
如果依赖项是注册单例,这不是什么大问题,但如果它们被注册为瞬态,那么它们将永远不会被处置(如果需要的话)并且Windsor将保持它们存活直到收集Windsor容器(当无论如何,Web服务器正在关闭).
我看到几种可能的处理方法......
a)这里有人指出了一种方法来将SignalR的HubDispatcher类子类化,以便它可以进行适当的处理.它不是SignalR的标准DependencyResolver的一部分,所以这可能很难/不可能
b)管道中其他地方的SignalR中的其他一些类可以被覆盖或轻松替换,以便我们可以继承HubDispatcher并确保使用子类.据我所知,这将是Owin中间件类HubDispatcherMiddleware.有没有办法迫使Owin不注册这个类,而是注册我自己的版本(这又使用我自己的HubDispatcher)?
c)有一种方法可以拦截SignalR在我的Hub类上进行的Dispose()调用,这样就可以调用Windsor来确保任何依赖关系被正确处理并从容器中释放
d)谨慎地避免使用瞬态生活方式依赖项,而是传入类型化工厂,以便我们可以通过Hub中的类型化工厂解决和释放每个依赖项
目前(d)是我知道该怎么做的唯一一个.(a)或(b)会很棒.(c)主要由本文http://kozmic.net/2010/01/27/transparently-releasing-components-in-windsor/涵盖,但是,拦截器要求通过IDisposable调用Dispose().SignalR的HubDispather类实现了集线器处理
private static void DisposeHubs(IEnumerable<IHub> hubs)
{
foreach (var hub in hubs)
{
hub.Dispose();
}
}
Run Code Online (Sandbox Code Playgroud)
没有转换到IDisposable那里...... Hub类上的Dispose()是虚拟的,而且博客帖子暗示虚拟Dispose()可能会增加一些复杂性(我不太确定多少,我不太了解无论如何,Castle的拦截器以及是否可以使用IDisposable进行处理.
我很欣赏我已经为一个相当狭隘的观众写了这个问题 - 那些使用过Windsor和SignalR而不仅仅是解决依赖关系的人.我发现的每个例子,包括StackOverflow上的例子,似乎都忽略了依赖关系的发布.
谢谢!
我正在尝试使用以下内容获取集线器的上下文:
var hubContext = GlobalHost.ConnectionManager.GetHubContext<SomeHub>();
Run Code Online (Sandbox Code Playgroud)
问题是没有定义GlobalHost.我看到它是SignalR.Core dll的一部分.目前,我在项目.json文件中,在依赖项下有以下内容:
"Microsoft.AspNet.SignalR.Server": "3.0.0-*"
Run Code Online (Sandbox Code Playgroud)
如果我添加最新的Core版本:
"Microsoft.AspNet.SignalR.Server": "3.0.0-*",
"Microsoft.AspNet.SignalR.Core" : "2.1.2"
Run Code Online (Sandbox Code Playgroud)
我得到了一大堆错误,因为服务器和核心是冲突的.如果我将它们更改为使用版本"3.0.0-*",则所有冲突都会消失,但无法找到GlobalHost.如果我删除服务器,只删除用户核心版本2.1.2然后GlobalHost工作,但所有其他需要服务器的东西,显然不会.
有任何想法吗?
我正在尝试从.net Web API控制器操作中调用客户端方法.
我可以这样做吗?
我能找到的唯一一个接近我要做的就是这个:
在那里,使用GlobalHost.ConnectionManager.GetHubContext从asp.net MVC控制器动作中发送消息.
当我在我的Web API操作中尝试时,不会抛出任何错误,但是从不在客户端调用方法"methodInJavascript".
Public ActionResult MyControllerMethod()
{
var context = GlobalHost.ConnectionManager.GetHubContext<MyHub>();
context.Clients.All.methodInJavascript("hello world");
// or
context.Clients.Group("groupname").methodInJavascript("hello world");
}
Run Code Online (Sandbox Code Playgroud)
当我在该动作中设置断点时,我看到代码正在被触及并执行.但是在javascript客户端没有任何事情发生.
为什么?Web API是如此不同,以至于这不起作用?有没有其他人尝试过并取得了成功?
当我从我的中心"内部"调用"methodInJavascript"时,它完美地工作.从.net Web API控制器操作中调用时,将无法正常工作.
更新:
在研究这个问题后,我没有解决方案.我只能假设有东西从像这样的例子失踪服务器与SignalR在ASP.NET MVC 4不会通过客户端的消息,这从控制器的WebAPI调用问题枢纽SignalR像也许有一个额外的配置步骤,以使从HubContext调用或者其他的东西.我最初在这里发布的代码就像那些示例中出现的代码没有被证明有任何缺陷.任何人都可以看到代码中的缺陷吗?从html调用工作.我在我的应用程序中广泛使用它,从未遇到过问题.我从未在API控制器工作中看到来自HubContext的调用.没有错误.对客户端没有任何结果.
已解决(种类):
上面的代码确实在发布时起作用.但是,通过localhost在Visual Studio开发环境中不起作用.客户端没有错误但没有结果.将代码原样发布到Web上的真实服务器确实有效.我从没想过会有什么不同所以我从未尝试过.如果它在本地不起作用,则无法发布.它现在正在运行,但我想知道为什么它在开发环境中不能通过localhost工作.无法使用断点等进行本地测试.
我感觉这是signalr虚拟目录.在本地运行和发布时有些不同.不知道什么,但我看到很多帖子,如http://www.bitwisejourneys.com/signalr-hosting-in-iis-a-nasty-gotcha/.现在阅读,看看是否有办法让它在本地和发布工作.
当我尝试HttpContext从HUB 访问当前会话时它返回null.
我尝试使用界面,IRequiresSession但它没有用.有人能帮我吗?
我正在使用signalr和asp.net MVC3来构建示例聊天应用程序.这是我的信号器中心的样子
public class MyHub:Hub,IDisconnect
{
public Task Join()
{
string username = HttpContext.Current.User.Identity.Name;
//find group based on username
string group = getGroup(username)
return Groups.Add(Context.ConnectionId, group);
}
public void doStuff()
{
string group = getGroup();
Clients[group].doStuffOnBrowser();
}
}
Run Code Online (Sandbox Code Playgroud)
我的问题是我的应用程序在页面加载时崩溃了.在使用调试器时,我发现HttpContext.Current.User.Identity.Name为null,即使用户已经过身份验证.如何在Task Join()方法中获取用户名?
我正在实施一个聊天室.到目前为止,这么好 - 用户可以通过JS客户端从他们的浏览器发送消息,我可以使用C#客户端做同样的事情 - 这些消息被广播给其他用户.现在,我正在尝试实施"在线用户".
我的方法如下:
OnConnected - 将数据库中的用户更新为IsOnline = trueOnDisconnected - 如果用户没有任何其他连接,请更新数据库中的用户 IsOnline = false我遇到的问题是OnDisconnected并不总是为每个客户端ID调用 - 过时的连接阻止"如果用户没有任何其他连接"位解析为true,那么用户总是"在线" ".
我能想到的一个hacky解决方案是始终在db中将用户设置为脱机OnDisconnect- 但这意味着如果用户打开两个选项卡并关闭一个选项卡,它们将"脱机".然后,我可以将用户重新设置为联机以获取发送的每条消息,但这似乎完全浪费了处理周期,并且仍然留下了一段时间,当用户真正在线时,用户被视为离线.
我相信,如果有办法保证为每个客户端调用OnDisconnected,这个问题就会消失.它看起来就像如果我离开的客户打开很长一段时间(> 10分钟),然后断开,OnDisconnected不会被调用.我会尽力确定repro步骤并保持更新.
那么 - 这是处理在线状态的有效方法吗?如果是这样,还有什么可以做的,以确保OnDisconnected最终为每个连接触发?
这个问题让我担心,因为现有的Connections会随着时间的推移而继续增长,如果我没有弄错的话,最终因为未处理的状态连接而溢出.
码:
我正在使用内存中的分组方法.
发送消息(C#):
private readonly static ConnectionMapping<string> _chatConnections =
new ConnectionMapping<string>();
public void SendChatMessage(string key, ChatMessageViewModel message) {
message.HtmlContent = _compiler.Transform(message.HtmlContent);
foreach (var connectionId in _chatConnections.GetConnections(key)) {
Clients.Client(connectionId).addChatMessage(JsonConvert.SerializeObject(message).SanitizeData());
}
}
Run Code Online (Sandbox Code Playgroud)
国家管理:
public override Task …Run Code Online (Sandbox Code Playgroud) 考虑像Facebook这样的Web应用程序,它可以向用户发送实时通知.
使用asp.net SignalR来跟踪哪个连接ID属于哪个用户的最佳方法是什么,即使用户断开连接或稍后重新连接?
我正在使用SignalR的Asp .Net 4.0框架上的Web应用程序,从Nuget包安装它.当我调试或运行应用程序而不在本地调试时,它可以正常工作.但是,当它部署到生产服务器时,它无法找到signal/hubs动态注入httphandlers的文件.由于它的动态特性,它必须在运行中创建,因此我不能将工作文件复制到项目中.
我尝试了以下加载文件的方法:
<script src="/signalr/hubs" type="text/javascript"></script>
<script src="signalr/hubs" type="text/javascript"></script>
Run Code Online (Sandbox Code Playgroud)
并在代码背后:
ScriptManager.GetCurrent(Page).Scripts.Add(new ScriptReference("~/signalr/hubs"));
Run Code Online (Sandbox Code Playgroud)
所有这些都在本地工作,但不在服务器上.在html中呈现的路径看起来是正确的,但那里没有文件,传递404错误.如果重要,服务器已将应用程序设置为完全信任,并且该应用程序将作为IIS中使用子域的另一个站点下的应用程序运行.
我在我的MVC3应用程序中使用SignalR,并且因为我在我的控制器上实现了StructureMap依赖注入,我想在我的集线器中执行相同操作,但我似乎无法使其工作.
请告诉我下面的代码有什么问题:
SignalRSmDependencyResolver.cs
public class SignalRSmDependencyResolver : DefaultDependencyResolver
{
private IContainer _container;
public SignalRSmDependencyResolver(IContainer container)
{
_container = container;
}
public override object GetService(Type serviceType)
{
object service = null;
if (!serviceType.IsAbstract && !serviceType.IsInterface && serviceType.IsClass)
{
// Concrete type resolution
service = _container.GetInstance(serviceType);
}
else
{
// Other type resolution with base fallback
service = _container.TryGetInstance(serviceType) ?? base.GetService(serviceType);
}
return service;
}
public override IEnumerable<object> GetServices(Type serviceType)
{
var objects = _container.GetAllInstances(serviceType).Cast<object>();
objects.Concat(base.GetServices(serviceType));
return objects;
}
}
Run Code Online (Sandbox Code Playgroud)
SignalRExtensionsRegistry.cs
public …Run Code Online (Sandbox Code Playgroud) structuremap dependency-injection asp.net-mvc-3 signalr signalr-hub
signalr-hub ×10
signalr ×9
c# ×5
asp.net ×2
action ×1
asp.net-core ×1
controller ×1
iis ×1
iis-7 ×1
structuremap ×1