我刚开始使用SignalR,并且能够毫无问题地向所有连接的客户端广播消息.我现在想让我的客户端(javascript)加入一个组,只接收该组的消息.在我的集线器中,我有以下方法添加到命名组的连接:
public Task JoinGroup(string groupName)
{
return this.Groups.Add(Context.ConnectionId, groupName);
}
Run Code Online (Sandbox Code Playgroud)
在客户端上,我有以下JS:
var latLonBounds = new google.maps.LatLngBounds();
var tripIdentifier = '@Model.TripIdentifier';
$(function () {
var hub = $.connection.locationHub;
hub.client.updateLocation = function (coordinates) {
// Implementation omitted
});
latLonBounds.extend(position);
map.fitBounds(latLonBounds);
};
$.connection.hub.logging = true;
$.connection.hub.start().done(function() {
hub.server.joinGroup(tripIdentifier);
});
});
Run Code Online (Sandbox Code Playgroud)
加载我的网页时,在Chrome中,我在控制台中看到以下网址的HTTP 500:
http://localhost:49914/signalr/send?transport=serverSentEvents&connectionToken=AQAAANCMnd8BFdERjHoAwE%2FCl%2BsBAAAA8OmZGDrRfEaOjaHahkkarwAAAAACAAAAAAAQZgAAAAEAACAAAADM78kCBInmZa7OROdPoXraiugBXLR5Xu3htxYC2JSnSAAAAAAOgAAAAAIAACAAAAAZwnPx6GMKOiw%2FivqQPlSfCb4WNP342YxvGyBpalmjSDAAAADljl1vg%2F7GYtD3R4AA2A9LXEnNZkyQVQjDUrW7ZVbvfPpWz1GCcOn6aw5yrkrWFrhAAAAAyX5otz0Xhx8tuIRgX2Pr1b9ZWFMvoairvqzns1%2FhjN%2BRhDIuAqAfonTbsZDjkdyDAZXzAKQqwTEKhpa5LYBhKg%3D%3D
Run Code Online (Sandbox Code Playgroud)
在Visual Studio中,我看到以下堆栈跟踪:
SignalR exception thrown by Task: System.AggregateException: One or more errors occurred. ---> System.MissingMethodException: No parameterless constructor defined for this object.
at System.RuntimeTypeHandle.CreateInstance(RuntimeType type, Boolean publicOnly, Boolean noCheck, Boolean& …Run Code Online (Sandbox Code Playgroud) 到目前为止,SignalR Hubs已经在我的开发机器上与IIS 7.5中的本地托管网站完美配合.我让客户端在click事件上向服务器发出信号器调用,然后服务器在将响应发送回客户端上的回调方法之前执行20秒的线程延迟.这适用于所有浏览器.但是,当我将应用程序部署到Windows Azure云时,SignalR开始出现这些间歇性问题.具体来说,服务器在客户端上达到回调方法似乎存在问题.我通过观看Chrome开发工具中的网络流量来验证这一点.我可以清楚地看到POST连接是由signalr做出的.它处于"挂起"状态20秒,然后当服务器响应时POST成功完成.但是,客户端的回调方法(带有简单的警报消息)并不总是因某种原因而触发.注意:在我的测试中,我注意到一些奇怪的行为,当回调方法没有触发时,我可以通过正常下载文件来解决它(通过使用href = window.baseUrl +'/ CloudStorage/DownloadZip?' )然后单击触发信号器的按钮.正如我在网络流量中看到这一点,不知何故window.baseUrl BOM命令触发信号器重新连接.非常感谢任何帮助!
编辑:我正在使用IE 10,最新的Chrome和最新的Firefox进行所有测试.当应用程序在云端时,IE 10似乎与signalr有最多的问题,这对我来说有点奇怪,因为这是一个MS产品.另外,我正在使用SignalR的1.1.2版本.
这是我的代码片段:
服务器端:
[HubName("MultiFile")]
public class MultiFile : Hub
{
[HubMethodName("Send")]
public void Send(string DocID)
{
System.Threading.Thread.Sleep(20000);
// Call the addMessage method on caller client
Clients.Caller.addMessage(DocID);
}
}
Run Code Online (Sandbox Code Playgroud)
客户端:
$('#dBtn').click(function () {
var docIds = sceneLayoutService.getSelection();
var href;
var docIdsParam;
if (docIds.length === 0) {
// signalr test code below
// Proxy created on the fly
var test_connection = $.connection.MultiFile;
// Declare a function on the MultiFile hub …Run Code Online (Sandbox Code Playgroud) 好的,所以这真的变得令人沮丧,我希望有人可以帮助我.我刚刚开始学习一些SignalR教程,所有这些都很有效.然后我决定添加一个MVC实体框架模型,以便对我的SignalR项目进行一些数据访问,这样我就可以存储已经发送到我的测试聊天消息中心的名称和消息.
这是令人沮丧的部分,当我从Visual Studio运行调试时,这一切都很有效但是当我发布到我的IIS服务器时,我的消息中心中的实体框架代码停止工作并抛出此错误:ProviderIncompatibleException
内部异常: "{"从数据库获取提供程序信息时发生错误.这可能是由实体框架使用不正确的连接字符串引起的.检查内部异常以获取详细信息,并确保连接字符串正确."}"
Next Inner Exception: {"提供程序未返回ProviderManifestToken字符串."}
最后一个内部异常: {"与SQL Server建立连接时发生与网络相关或特定于实例的错误.未找到或无法访问服务器.验证实例名称是否正确以及SQL Server是否配置为允许远程连接.(提供程序:SQL网络接口,错误:50 - 发生本地数据库运行时错误.在LocalDB实例启动期间发生错误:SQL Server进程无法启动.\ r \n)"}
在"db.Database.Initialize(false);"上抛出此错误 我的消息中心代码中的行.
这让我非常沮丧,以至于我昨晚一直在研究这些错误消息,直到凌晨1点.我真的很感激任何帮助.最令人沮丧的是这段代码非常简单,应该只是工作......
谢谢.
这是我的消息中心的代码:
public class BPACustomerServiceMessageHub : Hub
{
public void Send(string name, string message)
{
Database.SetInitializer(new CreateDatabaseIfNotExists<MessagesContext>());
using (MessagesContext db = new MessagesContext())
{
db.Database.Initialize(false);
Messages omsg = new Messages();
omsg.name = name;
omsg.message = message;
db.Messages.Add(omsg);
db.SaveChanges();
db.Dispose();
}
// Call the broadcastMessage method to update clients.
Clients.All.broadcastMessage(name, message);
SendParams mparams = new SendParams();
mparams.Name = name;
mparams.Message …Run Code Online (Sandbox Code Playgroud) 在下面的代码示例中,我实现了一个应该实现以下功能的SignalR Hub:
使用单例作为集线器上下文是安全的还是我每次都需要在OnFooChanged中获取它?关于其他方法的实施的反馈也是受欢迎的.毕竟我是SignalR的新手.
[Export]
public class FooHub : Hub
{
private static readonly Lazy<IHubContext> ctx = new Lazy<IHubContext>(
() => GlobalHost.ConnectionManager.GetHubContext<FooHub>());
#region Client Methods
public void Subscribe(int[] fooIds)
{
foreach(var fooId in fooIds)
this.Groups.Add(this.Context.ConnectionId, fooId.ToString(CultureInfo.InvariantCulture));
}
public void Unsubscribe(int[] fooIds)
{
foreach (var fooId in fooIds)
this.Groups.Remove(this.Context.ConnectionId, fooId.ToString(CultureInfo.InvariantCulture));
}
#endregion // Client Methods
#region Server Methods
/// <summary>
/// Called from service layer when an instance of foo has changed
/// …Run Code Online (Sandbox Code Playgroud) 我的asp.net项目中有一个Hub,我重写了OnConnected方法,我可以在OnConnected方法中调试代码吗?我放了一个断点,但它没有开火.
public class ConsultasHub : Hub
{
public override Task OnConnected()
{
//breakpoint here
//some code
//[...]
return base.OnConnected();
}
}
}
Run Code Online (Sandbox Code Playgroud) 我创建了一个 SignalR 项目。想要一个像基本whatsapp这样的应用程序。我可以使用 SignalR 向所有客户端发送消息,但无法向特定用户发送消息。
这是我尝试过的。
服务器端
public class Startup
{
public void Configuration(IAppBuilder app)
{
app.MapSignalR();
}
}
public class ChatHub : Hub
{
public static string UserName = "";
public void Send(string User, string Message)
{
//It doesn't works
Clients.User(UserName).sendMessage(Message);
//It works
Clients.All.sendMessage(Message);
}
public override Task OnConnected()
{
//It works I get the UserName
UserName = Context.QueryString["UserName"];
return base.OnConnected();
}
}
Run Code Online (Sandbox Code Playgroud)
客户端
protected override async void OnAppearing()
{
chatHubConnection = new HubConnection("http://192.168.2.2:80/", new Dictionary<string, string>{
{ "UserName", …Run Code Online (Sandbox Code Playgroud) 我有一个与信号 R 集成的基本 MVC 应用程序。我正在使用此应用程序跟踪在线用户。
以下是我的 Hub 课程
公共类 UserHub : Hub { static long counter = 0;
public override Task OnConnected()
{
//Update Count when User is connected
counter = counter+1;
Clients.All.UpdateCount(counter);
return base.OnConnected();
}
public override Task OnDisconnected(bool stopCalled)
{
counter = counter-1;
Clients.All.UpdateCount(counter);
return base.OnDisconnected(stopCalled);
}
Run Code Online (Sandbox Code Playgroud)
}
以下是我的javascript代码
$.connection.hub.logging = true;
//setup hubs
var userHub = $.connection.userHub;
$.connection.hub.start().done(function () {
});
//function to recieve data from server
userHub.client.UpdateCount = function (count) {
$('#counter').text(count);
}
Run Code Online (Sandbox Code Playgroud)
我也注册了 in startup.cs …
我已经按照本教程(https://blogs.msdn.microsoft.com/webdev/2018/02/27/asp-net-core-2-1-0-preview1-getting-started-with-signalr/)到构建并运行一个基本的聊天应用程序。
我现在需要从服务器更新客户端。换句话说,我需要能够调用集线器方法服务器端。我发现了几个使用旧版本 SignalR / .NET 的示例,但没有一个想要很好地与 ASP.NET Core 2.1 一起使用。
请有人帮助我提供有关如何从服务器发送消息的指针(或示例)。我认为我缺少的特定位是如何从服务器端代码获取对活动集线器的引用,以便我可以调用它的方法。
感觉应该很简单,所以我可能遗漏了一些明显的东西。
谢谢,尼克。
我有一个拍卖应用程序,我需要在其中显示每个用户的实时出价。我想使用的技术是前端的 Angular 6、实时通信的 Signal R 和后端 api 的 Asp.net MVC。我尝试使用@aspnet/signalR 以及 ng2-signalR
以下是我的一些代码:
App.component.ts
import { Component, Injectable } from '@angular/core';
import { SignalR, SignalRConnection, ISignalRConnection, BroadcastEventListener } from '../../node_modules/ng2-signalr';
import { Route, ActivatedRoute, Resolve } from '@angular/router';
import { BidService } from './app.service';
import { BidBlotter } from './Bid.Model';
import * as signalR from '@aspnet/signalr';
import { HubConnection } from '@aspnet/signalr';
// import '~/signalr/hubs';
declare var $: any;
@Component({
selector: 'app-root',
templateUrl: './app.component.html',
styleUrls: ['./app.component.css']
})
export class AppComponent …Run Code Online (Sandbox Code Playgroud) 关于 azure signalR 服务的信息非常有限。我需要澄清一个问题,所以任何帮助将不胜感激。azure signalR 服务实际上是如何向外扩展的?我的意思是,就我所做的工作而言。似乎您必须将 azure signalR 服务的主键包含到您的集线器中。您可以在任何地方托管您的集线器。那么集线器如何向外扩展。?
signalr-hub ×10
signalr ×9
c# ×5
asp.net-mvc ×4
asp.net ×2
azure ×2
angular5 ×1
angular6 ×1
javascript ×1
jquery ×1
server-side ×1
xamarin ×1