Tag: signalsr

从SignalR中心发送异步邮件

我需要通过SignalR集线器调用发送电子邮件。 我不希望send同步执行,因为我不想绑定WebSocket连接,但是如果可能的话,我希望通知调用者是否有任何错误。 我以为我可以在集线器中使用这样的东西(减去error handling和我希望它做的所有其他事情): public class MyHub : Hub { public async Task DoSomething() { var client = new SmtpClient(); var message = new MailMessage(/* setup message here */); await client.SendMailAsync(message); } } 但很快发现它不起作用; client.SendMailAsync调用抛出这个: System.InvalidOperationException:此时无法启动异步操作。 异步操作只能在异步处理程序或模块中启动,或者在页面生命周期中的某些事件中启动。 进一步的调查和阅读表明,SmtpClient.SendMailAsync是围绕EAP方法的TAP包装器,而SignalR不允许这样做。 我的问题是,有没有简单的方法直接从集线器方法发送电子邮件? 或者我唯一的选择是将电子邮件发送到其他地方? (例如,让集线器队列成为服务总线消息,然后一个独立的服务可以处理这些消息并发送电子邮件[虽然我也有更多的工作来实现将结果通知回集线器的客户端];或者让集线器向发送电子邮件的Web服务发出HTTP请求。

SignalR:在C#客户端中检测活动连接

我目前正在使用SignalR(2.1)Hubs开发应用程序。 我有一个WPF客户端,另一个是WCF客户端。 一切正常,因为他们完美地传递信息。 我现在遇到的唯一问题是我注意到当应用程序因自动重启,WCF服务器关闭以及其他一些原因而关闭时,OnDisconnected根本没有被触发。 超时是默认值30秒。 即使经过一天(我试过),也从未打过电话。 但是,超时适用于Web客户端。 它只在我调用hub.connection.stop()时才有效。 然而,当客户端是浏览器时,Ondisconnected方法非常有效。 因此,我想问一下Signal R Hub是否有办法检查客户端是否仍然连接或已经退出(例如ping)?

如何使用动态对象将变量用作方法名称

在SignalR中,HubConnectionContext中定义了公共属性,如下所示: public dynamic All { get; set; } 这使用户可以像下面这样调用它: All.someMethodName(); 这很棒。 我现在想在我的函数中使用传入参数来调用它。 我怎样才能做到这一点? 如: All.(); 有没有办法做到这一点? 谢谢 编辑示例: public void AcceptSignal(string methodToCall, string msg) { Clients.All.someMethod(msg); // THIS WORKS Clients.All.(msg); // THIS DOES NOT WORK (But I would like it to!) }

signalR和CustomTypeConverter

我想序列化派生类型,如这里所解释的但是对于signalR我想实现从JsonConverter派生的自定义转换器 我把它添加到signalR作为folows var serializer = GlobalHost.DependencyResolver.GetService(typeof(JsonSerializer)) as JsonSerializer; var i = new CustomTypeConverter(); serializer.Converters.Add(i); GlobalHost.DependencyResolver.Register(typeof(JsonSerializer), () => serializer); 当我调试此函数时,我应该在public override bool CanConvert(Type objectType)处理什么类型我没有看到我认为是我的解决方案的一部分的类型

如何使用SignalR保证消息传递?

我正在使用C#和SignalR开发实时客户端 – 服务器应用程序。 我需要尽快向客户发送消息。 我在服务器上的代码: for (int i = 0; i < totalRecords; i++) { hubContext.Clients.Client(clientList[c].Key).addMessage( serverId, RecordsList[i].type + RecordsList[i].value); Thread.Sleep(50); } 如果有延迟> = 50 ms,一切正常,但如果没有延迟或延迟小于50 ms,则会丢失一些消息。 我需要尽可能快地发送消息。 我想我需要检查是否收到消息,并且只在发送另一个消息之后。 如何以正确的方式做到这一点?

从WebAPI控制器问题调用SignalR集线器

我无法弄清楚如何通过WebAPI ApiController调用SignalR集线器。 我已经将您可以在此下载的示例放在一起,这样可以简化问题并演示问题。 我从ASP.NET MVC WebAPI模板创建了一个新项目。 我在名为ChatHub的项目中添加了一个新的SignalR Hub。 添加了一个HTML页面,该页面在加载时连接到ChatHub,加入组并向该组发送消息。 这很好用。 HTML页面还有一个按钮,单击该按钮将触发对ValuesController的post方法的ajax调用。 在ValuesController的post方法中,我想向该组的所有连接客户端广播一条消息。 我不能让这个工作。 我有一个简单的SignalR集线器,只有两种方法。 [HubName(“chat”)] public class ChatHub : Hub { public void Join(string room) { // NOTE: this is not persisted – …. Groups.Add(Context.ConnectionId, room); } public void Send(string room, string message) { var msg = String.Format( “{0}: {1}”, Context.ConnectionId, message); Clients.Group(room).newMessage(msg); } } […]

SignalR:使用GlobalHost.ConnectionManager发送数据不起作用

我有这样一个集线器: public class MessageHubBub : Hub { public void ServerMethod() { Clients.All.sayHi(“hello”); GlobalHost.ConnectionManager.GetHubContext().Clients.All.sayHi( “Hello” ); } } 我的(相关)javascript看起来像这样: $.connection.MessageHubBub.client.sayHi = function (message) { console.log(“Hello”); }; $.connection.hub.start().done(function () { $.connection.MessageHubBub.server.ServerMethod(); }); 真正奇怪的是“Hello”只打印一次,我希望它打印两次(因为’sayHello’被调用两次)。 一般来说,我使用从GlobalHost.ConnectionMananager获取的’clients’对象向客户端发送消息时遇到了麻烦,因此我将这个问题提炼出来以显示什么不起作用。 我已经看过很多post,人们遇到的问题包括在启动集线器之前没有使用客户端注册js处理程序或者没有引入正确的js依赖项,但这些似乎不是我的问题。 我有什么理由不能使用GlobalHost.ConnectionManager.GetHubContext()向客户端发送消息。客户端? 编辑:为了回应Lars,我确实有一个自定义依赖项解析器,以便我可以将Unity集成到SignalR中。 我按照我在这里找到的一个例子: http : //www.kevgriffin.com/using-unity-for-dependency-injection-with-signalr/ 我唯一的配置是如下: RouteTable.Routes.MapHubs( new HubConfiguration() { Resolver = new SignalRUnityDependencyResolver( unityContainer ) } ); SignalRUnityDependencyResolver如下所示: public class […]

从Controller调用SignalR Core Hub方法

如何从Controller调用SignalR Core Hub方法? 我使用ASP.NET Core 2.0与Microsoft.AspNetCore.SignalR(1.0.0-alpha2-final)。 我有与Excel,SolidEdge通信的Windows服务…当操作完成后,它会在ASP.NET Core应用程序中向我的控制器发送请求。 现在我需要通过SignalR通知连接到服务器的所有客户端外部程序完成了一些任务。 我无法改变窗口服务的工作方式。 (无法从窗口服务连接到SignalR)。 我为旧的SignalR(GlobalHost.ConnectionManager.GetHubContext)找到了很多解决方案,但是已经发生了很多变化,这些解决方案不再适用了。 我的控制器: [Route(“API/vardesigncomm”)] public class VarDesignCommController : Controller { [HttpPut(“ProcessVarDesignCommResponse/{id}”)] public async Task ProcessVarDesignCommResponse(int id) { //call method TaskCompleted in Hub !!!! How? return new JsonResult(true); } } 我的中心: public class VarDesignHub : Hub { public async Task TaskCompleted(int id) { await Clients.All.InvokeAsync(“Completed”, id); […]