我有一个服务应用程序,其工作方式与SignalR背板非常相似,所以我认为创建自己的IMessageBus实现与后端进行通信是个好主意,而不是推出自己的东西.问题是我无法找到有关此合同的更多信息.虽然我一直在看代码(看起来非常好),但我很难理解一些概念.
public interface IMessageBus
{
Task Publish(Message message);
IDisposable Subscribe(ISubscriber subscriber, string cursor, Func<MessageResult, object, Task<bool>> callback, int maxMessages, object state);
}
Run Code Online (Sandbox Code Playgroud)
Task Publish(Message message);这个很简单,基本上它必须向后端发送消息.我不担心这个,因为我的应用程序是从服务器到客户端的单向.
IDisposable Subscribe(ISubscriber subscriber, string cursor, Func<MessageResult, object, Task<bool>> callback, int maxMessages, object state);
return:尽管IDisposable有人说,我看到它总是返回一个Subscription对象,但为什么IDisposable呢?subscriber识别连接.该连接可以订阅或取消订阅组.cursor:是最后收到的消息ID.callback:这个回调何时执行?state:这究竟是什么?有人可以解释一下这种方法是如何工作的吗?
我想知道是否可以将SignalR消息直接添加到SignalR SQL背板(来自SQL),因此我不必使用SignalR客户端来执行此操作.
我的情况是我有一个SQL Service Broker队列的激活存储过程,当它触发时,我想向SignalR客户端发送一条消息.目前,我必须在单独的进程中从SQL Service Broker接收消息,然后立即使用SignalR集线器重新发送消息.
我希望我的激活存储过程基本上将消息直接移动到SignalR SQL背板上.
我正在使用
GlobalHost.DependencyResolver.UseSqlServer(ConfigurationManager.AppSettings["ConnectionString"]);
Run Code Online (Sandbox Code Playgroud)
为使用signalR(版本2.2.1)的Web应用程序设置SQL背板.Web应用程序托管在多个服务器上以及生产中的多个站点上.每个站点都有自己的数据库.
这在大多数服务器上都能正常工作(signalR连接和客户端之间的消息按预期流动).
但是 - 对于某些站点,signalR无法连接,并且fail()回调处理程序(客户端javascript)中存在以下消息:
"无法成功初始化传输.尝试指定不同的传输或根本不进行自动初始化."
启用客户端日志记录时,它显示signalR无法使用任何协议进行连接.
SignalR:后备传输耗尽.
工作站点和非工作站点之间的唯一区别是数据库连接字符串.在本地(在我的开发机器上)对生产数据库进行调试时,我看到了相同的行为.所以我认为这个问题与db中的SignalR表有关,但是当编写生产数据库脚本并在本地恢复它时,问题就不存在了.对于除db名称之外的所有网站,connectionstring都是相同的.
我无法弄清楚为什么signalR不能连接几个站点(30个中的2个) - 唯一的区别是数据库.如果我注释掉/禁用UseSqlServer配置它可以工作,但是然后没有启用同步原因.
如何解决这个问题的任何建议都是受欢 我见过与signalR相关的帖子无法连接,建议的解决方案与global.asax中Application_PreSendRequestHeaders的实现有关.在这种情况下,这似乎不是问题.
我们有一个简单的信号服务器和客户端,在启用背板的情况下运行。当我查看 IIS 工作进程时,我发现在当前请求选项卡中始终显示此信号器连接。
当我连接大约 100 个客户端时,woker 进程视图中会显示 100 个当前请求。连接后这些不应该被删除吗?或者这是信号器的预期行为?
使用单个应用程序实例(容器)运行网站时 - SignalR工作正常.
当扩展到更多实例(> 1)时,它会抛出错误而无法正常工作.我在互联网上寻找解释,发现我需要将Signalr配置为在群集中工作.我选择Redis作为我的背板.
我已经完成了许多关于如何正确完成它的教程并且它不适合我.
我在Google云端托管了asp.net core v2.1.使用Kestrel + nginx将应用程序部署为Docker容器.docker容器在负载均衡器后面的Kubernetes集群中运行.
Startup.cs:
public class Startup
{
public Startup(IConfiguration configuration,
IHostingEnvironment hostingEnvironment)
{
Configuration = configuration;
HostingEnvironment = hostingEnvironment;
}
// This method gets called by the runtime. Use this method to add services to the container.
public void ConfigureServices(IServiceCollection services)
{
// ...
services.AddSignalR().AddRedis(options =>
{
options.Configuration = new ConfigurationOptions
{
EndPoints =
{
{ ConfigurationManager.Configuration["settings:signalR:redis:host"], int.Parse(ConfigurationManager.Configuration["settings:signalR:redis:port"])}
},
KeepAlive = 180,
DefaultVersion = new Version(2, …Run Code Online (Sandbox Code Playgroud) 目前,我们使用 SignalR 在 UI 客户端上从后端接收实时消息。UI 客户端在在线并连接到 SignalR 时接收消息,并在断开连接时错过消息(例如:用户关闭页面并且 SignalR 断开客户端连接)。但是,现在我们需要向用户显示所有消息,包括 UI 客户端离线时 SignalR 发送的消息。SignalR 可以支持这种场景吗?该要求类似于 UI 客户端消息的持久队列,但我们使用 SignalR 向所有客户端广播消息。
signalr signalr-hub signalr.client signalr-backplane asp.net-core-signalr
我目前正在玩SignalR 2.0.3,使用Backslane扩展,使用Redis for windows http://msopentech.com/blog/2013/04/22/redis-on-windows-stable-and-reliable/
我已经在VS中集成了相应的SignalR.Redis包.
我对我的创业做了以下更改:
GlobalHost.DependencyResolver.UseRedis(
server: "localhost",
port: 6379,
password: string.Empty,
eventKey: "BroadcasterExample"
);
app.MapSignalR(hubConfiguration);
Run Code Online (Sandbox Code Playgroud)
它建立得很好.我的客户端似乎连接正常.我可以在客户端和服务器之间发送通知,反之亦然.
从Redis客户端,我可以输入:
get BroadcasterExample
which returns: "3"
Run Code Online (Sandbox Code Playgroud)
我认为事情正在发挥作用,但......
几个问题: 1)我怎么知道它实际上有效?
2)我可以在Redis服务器上检查什么(虽然是Redis客户端)?
3)什么是存储在什么数据结构(键/值对,列表,散列,集)?
我想深入了解一下发生了什么.我查看了以下命令:http: //redis.io/commands 没有什么是跳出来的,这将帮助我映射真实情况.
有人能指出我在正确的方向吗?
谢谢,JohnB
我希望用户检索他们在重新连接到 Signalr 服务器时可能错过的消息。
我知道我可以独立于 Signalr 保留消息,跟踪在客户端收到的最后一条消息 ID 并在重新连接时重新发送较新的消息,但我正在查看 SqlServer 背板的 Messages_0 表,它有一个 Payload 和 PayloadID 并且想知道是否有是让背板为我执行此操作或扩展背板为我执行此操作的更信号化的方式。
你有什么想法我可以怎么做吗?
我目前在Azure上托管我的redis缓存服务器,并使用以下信号依赖signalR作为主干...
GlobalHost.DependencyResolver.UseRedis( "服务器",港口, "密码", "eventKey");
这可以在端口6379(非SSL)上找到,但是当我尝试连接到Azure Redis服务器的SSL端口(6380)时,我的聊天应用程序中断了,并且集线器从未启动过.这个问题可能是什么原因?或者我做错了什么?
这是我的浏览器net :: ERR_CONNECTION_RESET中/ signalr/connect上出现的错误
redis signalr signalr-hub signalr-backplane azure-redis-cache
我们在冗余的Azure Web应用程序中使用SignalR和Redis(Azure缓存)背板.我们几天前检测到所有SignalR消息似乎都没有交付(它在过去有效),因此指出了背板的问题.
该应用程序使用ASP.Net Owin启动以及Autofac作为集线器的IoC,我们启动SignalR,如下所示:
GlobalHost.DependencyResolver.UseRedis(new RedisScaleoutConfiguration(redisConnectionString, signalrRedisKey));
var hubConfiguration = new HubConfiguration
{
Resolver = new AutofacDependencyResolver(resolver)
};
app.UseAutofacMiddleware(resolver);
app.MapSignalR("/signalr", hubConfiguration);
Run Code Online (Sandbox Code Playgroud)
如果我将Redis背板配置字符串更改为无效的东西并不重要,它就不会连接.SignalR代码位于Web主机之外的另一个组件中.
我在应用程序中没有任何异常,但是在跟踪SignalR时我遇到了以下错误:
SignalR.ReflectedHubDescriptorProvider警告:0:搜索集线器时,无法加载程序集"Microsoft.AspNet.SignalR.Owin,Version = 1.2.2.0,Culture = neutral,PublicKeyToken = 31bf3856ad364e35"中的某些类.[C:\ Windows\Microsoft.NET\Framework64\v4.0.30319\Temporary ASP.NET
文件\根\ 79fa3057\a44a64e \组件\ DL3\75de3633\cfc73faf_eb21d101\Microsoft.AspNet.SignalR.Owin.dll]
原始异常类型:ReflectionTypeLoadException原始异常消息:无法加载一个或多个请求的类型.检索LoaderExceptions属性以获取更多信息.
它是nuget的依赖问题吗?
这是我们的packages.config的相关摘录:
<package id="Autofac" version="3.5.2" targetFramework="net46" />
<package id="Autofac.Owin" version="3.1.0" targetFramework="net46" />
<package id="Autofac.SignalR" version="3.0.2" targetFramework="net46" />
<package id="Castle.Core" version="3.3.3" targetFramework="net46" />
<package id="Microsoft.AspNet.SignalR.Client" version="2.2.0" targetFramework="net46" />
<package id="Microsoft.AspNet.SignalR.Core" version="2.2.0" targetFramework="net46" />
<package id="Microsoft.AspNet.SignalR.Redis" version="2.2.0" targetFramework="net46" />
<package id="Microsoft.Owin" version="3.0.1" targetFramework="net46" />
<package …Run Code Online (Sandbox Code Playgroud)