服务器:
public void AddLine(string line)
{
Clients.Others.addLine(line);
}
Run Code Online (Sandbox Code Playgroud)
.NET客户端:
await rtHubProxy.Invoke("AddLine", "lineInfo");
Run Code Online (Sandbox Code Playgroud)
例外:
InvalidOperationException: There was an error invoking Hub method 'xxx.AddLine'.
Run Code Online (Sandbox Code Playgroud)
实际上,我试图用复杂的对象调用方法,只是为了找到异常.因此,我更改了参数的类型并将AddLine()体留空以进行调试,奇怪的是,它仍然抛出相同的异常.
我在客户端也有另一个SignalR调用,上面只有几行,响应性地运行而没有错误.相应的服务器端代码如下:
public void Hello(string text)
{
Clients.All.hello(text);
}
Run Code Online (Sandbox Code Playgroud)
谁能找到我错在哪里?我已经调试了超过4个小时,即使在我简化代码后仍然无法找到撤消.
(严格检查拼写,没有不匹配.)
我正在实施一个聊天室.到目前为止,这么好 - 用户可以通过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) 我正在尝试在单个项目中使用OWIN,SignalR和Autofac.
我正在设置有关signalR的内容如下:
// Create the AutoFac container builder:
var builder = new ContainerBuilder();
// ...[Register various other things in here]...
// register signalR Hubs
builder.RegisterHubs(Assembly.GetExecutingAssembly());
// Build the container:
var container = builder.Build();
// Configure SignalR with the dependency resolver.
app.MapSignalR(new HubConfiguration
{
Resolver = new AutofacDependencyResolver(container)
});
Run Code Online (Sandbox Code Playgroud)
我的问题是,当我使用Autofac SignalR集成时,我不能再在服务器上获取signalR Hub Context(例如在webapi控制器中),因此无法从服务器端向连接的客户端发送消息.当我不使用Autofac signalR集成时,如下所示:
var hubContext = GlobalHost.ConnectionManager.GetHubContext<MyHub>();
hubContext.Clients.All.notification("Test Message");
Run Code Online (Sandbox Code Playgroud)
但是当我将Autofac添加到混合中时,这不起作用 - 我没有得到任何错误消息,我似乎得到了一个hubContext,但是对它的调用实际上似乎并没有到达客户端.
如果我在对MapSignalR的调用中注释掉了对signalR的依赖性解析器的使用,那么对GetHubContext的调用再次起作用并且消息成功地到达signalR客户端,但当然我不能再在我的集线器上使用IoC.例如
// Configure SignalR with the dependency resolver.
app.MapSignalR(new HubConfiguration
{
// Resolver = new AutofacDependencyResolver(container)
});
Run Code Online (Sandbox Code Playgroud)
谁能告诉我为什么使用AutofacDependencyResolver会阻止GlobalHost.ConnectionManager.GetHubContext正常工作? …
我有一个WPF客户端 - 服务器应用程序.现在我有客户端将连接到服务器的场景,服务器将定期将数据推送到客户端.我对应该选择哪种技术和方式来通知客户感到困惑.
SignalR最适合我认为的Web应用程序,我有桌面应用程序.通过WCF服务,我们可以通过双工通道和回调实现推送通知.那么请您指导我使用SignalR或WCF服务的优点和缺点是什么?
谢谢
我只是从VS2010 express升级到VS2013 express并打开我的项目.我发现SignalR正在运行,但我不需要它.Firebug正在填充SignalR消息.我花了很长时间来搜索如何停止/关闭它,但我找不到它.
我正在开发AngularJS,Web API,SignalR应用程序的原型,作为VS 2013中新项目的潜在起点.
在这个阶段,我几乎使用visual studio为个人用户帐户生成的预制代码.
StartUp.Auth.cs代码中有一行看起来像这样.
app.UseOAuthBearerTokens(OAuthOptions);
Run Code Online (Sandbox Code Playgroud)
有了这个,我可以将[Authorize]属性添加到控制器,它工作正常.
顺便说一句,使用angular我可以在JavaScript中添加包含令牌的标准头,如下所示.
$http.defaults.headers.common.Authorization = 'bearer ' + access_token;
Run Code Online (Sandbox Code Playgroud)
然后我将SignalR添加到项目中.
它支持自己的[Authorize]属性版本,但在使用SignalR时无法传递自定义标头.
这是浏览器方面的限制.
文档说您可以将令牌作为查询字符串的一部分传递.
我在JavaScript方面添加了该代码.我的SignalR代码现在包含了这个.
我将令牌传递为'bearer_token'.
this.connection = $.hubConnection("/TestHub", { useDefaultPath: false, qs: "bearer_token=" + token });
Run Code Online (Sandbox Code Playgroud)
所以我的问题是如何使OWIN识别令牌现在它不再在标题中.
经过多次搜索后,我最终添加了将令牌从查询字符串移动到标题中的代码.
对于我的原型,我刚刚在StartUp.Auth.cs的原始行上面添加了一些代码.
所以,现在它看起来像这样:
app.UseOAuthBearerAuthentication(new OAuthBearerAuthenticationOptions()
{
Provider = new OAuthBearerAuthenticationProvider()
{
OnRequestToken = context =>
{
if (context.Request.Path.Value.StartsWith("/TestHub"))
{
string bearerToken = context.Request.Query.Get("bearer_token");
if (bearerToken != null)
{
string[] authorization = new string[] { "bearer " + bearerToken };
context.Request.Headers.Add("Authorization", authorization);
}
}
return Task.FromResult(context);
}
} …Run Code Online (Sandbox Code Playgroud) 'Owin.IAppBuilder'不包含'MapSignalR'的定义,也没有可以找到接受类型'Owin.IAppBuilder'的第一个参数的扩展方法'MapSignalR'(你是否缺少using指令或汇编引用?)
using Microsoft.Owin;
using Owin;
[assembly: OwinStartup(typeof(SignalRChat.Startup))]
namespace SignalRChat
{
public class Startup
{
public void Configuration(IAppBuilder app)
{
// Any connection or hub wire up and configuration should go here
app.MapSignalR();
}
}
}
Run Code Online (Sandbox Code Playgroud)
任何帮助将不胜感激...
signalR版本2.0.3
Microsoft Owin版本2.0.2
Owin版本1.0.0
Visual Studio 2012
我有一个负载非常高的网站,并将我的测试应用程序保存在隐藏的iframe下,以确保目标框架是我的用例的一个不错的选择.首先尝试SignalR测试应用程序,然后在相同的服务器配置下Pokein.目前我们正在使用Flash远程处理解决方案,但很快我们计划对其进行更改.
我花了一些时间来制作基于SignalR的测试应用程序,以便在我网站的高负载下处理并发客户端更新.它在这种情况下运行良好(一些客户端请求消息)..当大多数连接的客户端同时请求消息时,它显着失败(我需要从iframe调用中删除它)..我我怀疑我的服务器配置是问题,但同样的情况工作在其他付费解决方案Pokein没有任何问题.
有没有我忘记的伎俩?
2012年2月10日更新: 虽然我们决定在我们的解决方案中实现PokeIn,但我在Github上尝试了最新的SignalR代码(可能对其他人有帮助)..结果是一样的.
March.13.2012更新: 场景:(再一次) - 尝试在给定的时间间隔内向成千上万个连接的客户端发送消息(1秒).测试和查看结果并不难.我觉得,我是唯一一个强调图书馆这种非常常见用法的人.
详细信息(如何重现 - 使用Github 0.5测试) - Server 2008 R2 32GB DDR3,i7-2600 3.4Ghz,2x256 GB Crucial M4 - ASP.NET 3.5
此页面嵌入到由多个网站加载的隐藏iframe中,以便进行真实的负载测试.
问题
系统在某些时候锁定(大约800个用户),并且大多数客户端没有从服务器获得更新的时间
一旦系统锁定,该单个应用程序页面就会停止响应
我也尝试将间隔增加到5秒.这次系统响应更快(约950名用户)但结果相同.我在.NET 2和.NET 4应用程序池上尝试过这个.
希望这些细节足够.重复这个测试对我来说很容易,一旦我找到空闲时间,我将在未来的版本中重复测试.
我正在使用SignalR Javascript客户端和ASP.NET ServiceHost.我需要SignalR集线器和回调才能被登录用户访问.我还需要能够使用HttpContext.Current.User中的FormsIdentity从Hub获取当前登录用户的身份.
我认为使用我自己的IoC对SignalR非常简单,也许是; 我很可能做错了什么.这是我到目前为止的代码:
private static void InitializeContainer(Container container)
{
container.Register<IMongoHelper<UserDocument>, MongoHelper<UserDocument>>();
// ... registrations like about and then:
var resolver = new SimpleInjectorResolver(container);
GlobalHost.DependencyResolver = resolver;
}
Run Code Online (Sandbox Code Playgroud)
然后我的班级:
public class SimpleInjectorResolver : DefaultDependencyResolver
{
private Container _container;
public SimpleInjectorResolver(Container container)
{
_container = container;
}
public override object GetService(Type serviceType)
{
return _container.GetInstance(serviceType) ?? base.GetService(serviceType);
}
public override IEnumerable<object> GetServices(Type serviceType)
{
return _container.GetAllInstances(serviceType) ?? base.GetServices(serviceType);
}
}
Run Code Online (Sandbox Code Playgroud)
最终发生的事情是我得到一个IJavaScriptProxyGenerator无法解决的错误,所以我想,我会添加注册:
container.Register<IJavaScriptProxyGenerator, DefaultJavaScriptProxyGenerator>(
ConstructorSelector.MostParameters);
Run Code Online (Sandbox Code Playgroud)
但是还有其他一些人!我到达:
container.Register<IDependencyResolver, SimpleInjectorResolver>();
container.Register<IJavaScriptMinifier, NullJavaScriptMinifier>();
container.Register<IJavaScriptProxyGenerator, DefaultJavaScriptProxyGenerator>(
ConstructorSelector.MostParameters);
container.Register<IHubManager, …Run Code Online (Sandbox Code Playgroud)