我使用SignalR 1.0.当服务器上发生异常时,客户端会收到这样的消息
{"I":"0","E":"抛出类型'System.Exception'的异常.","T":"在ds:\ PATH\TO\HUB.cs中的METHODNAME:第227行\ r \n \n在ds:\ PATH\TO\HUB.cs中的METHODNAME:第51行"}
但我想让它更加用户友好.我该怎么做?我已经阅读了将所有服务器方法放入try-catch块的建议.但我认为这不是一个真实的方式.
我跟踪了Exception,发现在Microsoft.AspNet.SignalR.Hubs.HubDispatcher.Incoming方法中捕获了异常.但它是内部静态方法,我无法自定义.
在理想情况下,我希望能够将异常转换为有效的响应.
当我在本地计算机上运行该网站时,它可以正常工作,但是当我上传到我的域时,它开始生成此错误.我在差异服务器上的两个应用程序上遇到同样的问题.同样只是实现解决方案,什么是ASP.Net MVC 3,C#.我的两个应用程序都运行在IIS服务器上的"完全信任"保护.在本地它工作正常但问题出在远程服务器上.
应用程序运行正常,但返回错误:(这是mozilla firebug/network的截图.

我遇到了需要使用不同配置的多个SignalR集线器(至少2个)的情况.
目前使用v1.1.0我只能执行以下配置所有集线器的操作:
GlobalHost.Configuration.ConnectionTimeout = TimeSpan.FromSeconds(30);
Run Code Online (Sandbox Code Playgroud)
是否可以为多个集线器设置不同的配置?
我能够使用我自己的DI与SignalR 1.13一起工作:
//Funq container
GlobalHost.DependencyResolver = new FunqDependencyResolver(container);
RouteTable.Routes.MapHubs();
Run Code Online (Sandbox Code Playgroud)
现在有了新版本2.0,我被困住了.
using Microsoft.Owin;
using Owin;
//SignalR 2.0 no longer uses RouteTable.Routes.MapHubs();
[assembly: OwinStartup(typeof(SignalRChat.Startup))]
namespace SignalRChat {
public class Startup {
public void Configuration(IAppBuilder app) { app.MapSignalR(); }
}
}
Run Code Online (Sandbox Code Playgroud)
(VS2013中的新SignalR 2.0设置截图)

首先,它是从VS2013从屏幕这里.我的VS2012 Pro没有Create New ...-> OWIN Startup类.我手写了一个.但是现在如何调用新的启动类来替换旧的MapHub()函数?
其次,我正在使用运行其余Web项目的DI.我如何现在将signalR注册到我的DI?
编辑--------------------------------------------
问题还有一点.我在Global.asax.cs-> Application_Start()中创建了我的DI容器,但是自动创建并调用了SignalR Startup.cs-> Configuration().如何将DI容器传递给SignalR Startup?
Global.asax.cs(这在应用程序启动时自动运行)
protected void Application_Start(object sender, EventArgs e)
{
var appHost = new AppHost(); //DI init
appHost.Init();
var container = appHost.Container; //DI container here …Run Code Online (Sandbox Code Playgroud) 当用户登录我的网站时,他们会从下拉列表中选择他们所属的组.在登录回发时,当他们登录时,我想将它们分配给正确的SignalR组.
根据此处的文档,我可以通过以下方式加入客户端:
contosoChatHubProxy.server.joinGroup(groupName);
Run Code Online (Sandbox Code Playgroud)
有没有办法从控制器分配组?我可以称之为Hub:
var hub = new NotificationHub()
hub.JoinGroup(selectedGroup);
Run Code Online (Sandbox Code Playgroud)
但hub方法中的Context为null.这可能,或者我是否错误地接近了这个问题?谢谢你的任何建议.
我仍然得到SignalR的基础知识.我想在我的网站的不同部分使用它,所以我想我可以在主布局中启动连接,并在子视图中添加客户端方法.
根据这个答案,我有:
window.hub = $.connection.hub.start();
Run Code Online (Sandbox Code Playgroud)
在我的Layout.cshtml中,和
window.hub.done(function () {
$.connection.notificationHub.server.joinScannerGroup(1);
alert("in sub view");
});
Run Code Online (Sandbox Code Playgroud)
在我的子视图中,哪个有效.集线器已连接,并且JoinScannerGroup()调用该方法.但是,如果我尝试添加:
$.connection.notificationHub.client.scanReceived = function (text) {
alert("scan received");
};
Run Code Online (Sandbox Code Playgroud)
在子视图的javascript中的任何地方,它永远不会被调用.也许我认为它错了,但我想在主页上连接,然后允许任何子页面接收客户端调用.
此外,如果我移动$.connection.start()到子视图,它确实可以正常工作.我理解错了吗?
我一直在研究与负载均衡器结合的SignalR实现,并且有一些基本的(如果不是简单的声音)问题.我必须在前言中说我对负载平衡器有零(0)经验.
我们将有2台服务器位于负载均衡器后面.客户端是ASP .Net应用程序.我们被告知负载均衡器保持会话亲和力.
请考虑以下情形:
Client1 & Client2 -- connect to GroupA--> Server1
Client3 & Client4 -- connect to GroupA--> Server2
Run Code Online (Sandbox Code Playgroud)
1)Server1对GroupA进行客户端调用 - 这假设客户端1-4将获得通知,对吗?
2)如何处理?
3)它是SignalR本身或负载均衡器的功能吗?
4)在组级别发送消息时,仅将消息传递到与该特定服务器上的组关联的客户端应用程序,还是将消息转发给该组的所有客户端?
有没有人对此有任何想法?
谢谢,JB
我正在测试一个SignalR服务器(在控制台应用程序中自托管),它最终将构成数据记录系统的基础.测试客户端正在向集线器发出大约180个呼叫/秒,而消息本身非常小(只是一个名称/值对).
我正在使用Castle Windsor进行DI,使用自定义IHubActivator来解析Hub实例:
internal class WindsorHubActivator : IHubActivator
{
private readonly IWindsorContainer _container;
public WindsorHubActivator(IWindsorContainer container)
{
_container = container;
}
public IHub Create(HubDescriptor descriptor)
{
var hubType = descriptor.HubType;
return _container.Resolve(hubType) as IHub;
}
}
Run Code Online (Sandbox Code Playgroud)
这是集线器类:
public class TelemetryHub : Hub
{
private readonly TelemetryDataService _telemetryDataService;
public TelemetryHub(TelemetryDataService telemetryDataService)
{
_telemetryDataService = telemetryDataService;
}
public void LogTelemetryData(string name, double value)
{
_telemetryDataService.LogTelemetryData(name, value);
}
}
Run Code Online (Sandbox Code Playgroud)
当集线器类在Windsor注册为"瞬态"时,内存消耗量稳步攀升,直到达到2Gb然后因OOM异常而下降.如果我将Hub注册为"Singleton",那么应用程序内存消耗将保持非常低且一致.
该TelemetryDataService班是不是问题.我已经注释掉了hub的构造函数和方法代码,问题仍然存在.
出于好奇,我接着进一步改变了阶段,改变了WindsorHubActivator阶级,将温莎带出了等式:
internal class WindsorHubActivator : IHubActivator …Run Code Online (Sandbox Code Playgroud) 我正在使用SignalR Client连接HubConnection.在调用时Start(),System.Net.WebException会抛出以下消息:
远程服务器返回错误:(400)错误请求.
服务器响应是:
不是有效的Web套接字请求.
我正在运行带有IIS 8.5的Windows Server 2012 R2
可能是什么问题呢?
我正在使用AspNetCore.SignalR,并且需要有关如何通过集线器访问SQL Server数据库的建议。有关此的资源不多。我知道如何添加一个单例,但以后不知道如何访问它。如何访问使用集线器任务内Startup.cs中的Configuration.GetConnectionString定义的数据库上下文?
谢谢。
以下是相关代码:
启动文件
public void ConfigureServices(IServiceCollection services)
{
services.Configure<CookiePolicyOptions>(options =>
{
options.CheckConsentNeeded = context => true;
options.MinimumSameSitePolicy = SameSiteMode.None;
});
services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_1);
DbContextOptionsBuilder<PlayerContext> PlayerContextOptions = new DbContextOptionsBuilder<PlayerContext>();
PlayerContextOptions.UseSqlServer(Configuration.GetConnectionString("Default"));
services.AddSingleton(PlayerContextOptions.Options);
services.AddDbContext<PlayerContext>(options => options.UseSqlServer(Configuration.GetConnectionString("Default")));
services.AddCors(options => options.AddPolicy("CorsPolicy",
builder =>
{
builder.AllowAnyMethod().AllowAnyHeader()
.AllowCredentials();
}));
services.AddSignalR();
}
Run Code Online (Sandbox Code Playgroud)
但是我根本不知道该在Hub文件中做什么。我什至不知道从哪里开始。我添加了单例,但是我不知道如何在我的中心文件中访问它。这是我想做的,但是我愿意做一个更好的方法:
MyHub.cs
using (PlayerContext dbContext = new PlayerContext(/* Singleton needs to go here */))
{
// do database stuff
}
Run Code Online (Sandbox Code Playgroud)