标签: signalr

SignalR:调用Hub方法"XXX"时出错

服务器:

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个小时,即使在我简化代码后仍然无法找到撤消.

(严格检查拼写,没有不匹配.)

.net c# windows-8 windows-runtime signalr

29
推荐指数
1
解决办法
2万
查看次数

SignalR OnDisconnected - 为聊天室处理"用户在线"的可靠方法?

我正在实施一个聊天室.到目前为止,这么好 - 用户可以通过JS客户端从他们的浏览器发送消息,我可以使用C#客户端做同样的事情 - 这些消息被广播给其他用户.现在,我正在尝试实施"在线用户".

我的方法如下:

  • OnConnected - 将数据库中的用户更新为IsOnline = true
  • OnDisconnected - 如果用户没有任何其他连接,请更新数据库中的用户 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)

c# signalr signalr-hub signalr.client

29
推荐指数
1
解决办法
2万
查看次数

SignalR + Autofac + OWIN:为什么GlobalHost.ConnectionManager.GetHubContext不起作用?

我正在尝试在单个项目中使用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正常工作? …

asp.net autofac signalr owin

29
推荐指数
1
解决办法
7962
查看次数

使用SignalR vs WCF将数据推送到客户端?

我有一个WPF客户端 - 服务器应用程序.现在我有客户端将连接到服务器的场景,服务器将定期将数据推送到客户端.我对应该选择哪种技术和方式来通知客户感到困惑.

SignalR最适合我认为的Web应用程序,我有桌面应用程序.通过WCF服务,我们可以通过双工通道和回调实现推送通知.那么请您指导我使用SignalR或WCF服务的优点和缺点是什么?

谢谢

wcf push-notification signalr

28
推荐指数
2
解决办法
2万
查看次数

如何停止/关闭SignalR服务

我只是从VS2010 express升级到VS2013 express并打开我的项目.我发现SignalR正在运行,但我不需要它.Firebug正在填充SignalR消息.我花了很长时间来搜索如何停止/关闭它,但我找不到它.

signalr visual-studio-2013

28
推荐指数
1
解决办法
7173
查看次数

Web API/OWIN,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)

c# asp.net signalr angularjs owin

28
推荐指数
3
解决办法
1万
查看次数

'Owin.IAppBuilder'不包含'MapSignalR'的定义

错误

'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

asp.net signalr owin

28
推荐指数
3
解决办法
5万
查看次数

SignalR在高负载下失败

我有一个负载非常高的网站,并将我的测试应用程序保存在隐藏的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应用程序池上尝试过这个.

希望这些细节足够.重复这个测试对我来说很容易,一旦我找到空闲时间,我将在未来的版本中重复测试.

.net c# asp.net high-load signalr

27
推荐指数
0
解决办法
5101
查看次数

保护SignalR呼叫

我正在使用SignalR Javascript客户端和ASP.NET ServiceHost.我需要SignalR集线器和回调才能被登录用户访问.我还需要能够使用HttpContext.Current.User中的FormsIdentity从Hub获取当前登录用户的身份.

  1. 如何保护集线器,以便只有经过身份验证的用户才能使用SignalR?
  2. 如何从Hub获取当前登录用户的身份?

signalr

27
推荐指数
2
解决办法
5905
查看次数

使用SimpleInjector和SignalR

我认为使用我自己的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)

c# simple-injector signalr

27
推荐指数
3
解决办法
1万
查看次数