我有这样一个集线器:
public class MessageHubBub : Hub
{
public void ServerMethod()
{
Clients.All.sayHi("hello");
GlobalHost.ConnectionManager.GetHubContext<MessageHubBub>().Clients.All.sayHi( "Hello" );
}
}
Run Code Online (Sandbox Code Playgroud)
我的(相关)javascript看起来像这样:
$.connection.MessageHubBub.client.sayHi = function (message) {
console.log("Hello");
};
$.connection.hub.start().done(function () {
$.connection.MessageHubBub.server.ServerMethod();
});
Run Code Online (Sandbox Code Playgroud)
真正奇怪的是,"Hello"只打印一次,我希望它打印两次(因为'sayHello'被调用两次).一般来说,我使用从GlobalHost.ConnectionMananager获得的'clients'对象向客户端发送消息时遇到了麻烦,因此我将这个问题提炼出来以显示什么不起作用.
我见过很多帖子,人们遇到的问题包括在启动集线器之前没有注册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 ) } );
Run Code Online (Sandbox Code Playgroud)
SignalRUnityDependencyResolver如下所示:
public class SignalRUnityDependencyResolver : DefaultDependencyResolver
{
private IUnityContainer _container;
public SignalRUnityDependencyResolver( IUnityContainer container )
{
_container = container;
}
public override object GetService( Type serviceType )
{
if ( …Run Code Online (Sandbox Code Playgroud) 我目前正在使用SignalR在服务器和服务器本身产生的多个独立进程之间进行通信.Server和Client都用C#编码.我正在使用SignalR 2.2.0.0在服务器端,我使用OWIN来运行服务器.我也使用LightInject作为IoC容器.
这是我的代码:
public class AgentManagementStartup
{
public void ConfigurationOwin(IAppBuilder app, IAgentManagerDataStore dataStore)
{
var serializer = new JsonSerializer
{
PreserveReferencesHandling = PreserveReferencesHandling.Objects,
TypeNameHandling = TypeNameHandling.Auto,
TypeNameAssemblyFormat = FormatterAssemblyStyle.Simple
};
var container = new ServiceContainer();
container.RegisterInstance(dataStore);
container.RegisterInstance(serializer);
container.Register<EventHub>();
container.Register<ManagementHub>();
var config = container.EnableSignalR();
app.MapSignalR("", config);
}
}
Run Code Online (Sandbox Code Playgroud)
在客户端,我这样注册:
public async Task Connect()
{
try
{
m_hubConnection = new HubConnection(m_serverUrl, false);
m_hubConnection.Closed += OnConnectionClosed;
m_hubConnection.TraceLevel = TraceLevels.All;
m_hubConnection.TraceWriter = Console.Out;
var serializer = m_hubConnection.JsonSerializer;
serializer.TypeNameHandling = TypeNameHandling.Auto;
serializer.PreserveReferencesHandling = PreserveReferencesHandling.Objects;
m_managementHubProxy …Run Code Online (Sandbox Code Playgroud) 我正在尝试配置 MVC 5 应用程序以使用 SignalR 2.2.x 并将服务注入到我的NotificationsHub. 我们正在使用 Autofac 进行 MVC,但我不确定如何正确配置它。NuGetAutofac.Integration.SignalR (3.0.2)和Autofac.Integration.Mvc (3.3.4).
到目前为止我正在做的是通过以下方式注册集线器:
ContainerBuilder builder = new ContainerBuilder();
// Register MVC controllers.
builder.RegisterControllers(typeof(MvcApplication).Assembly);
builder.RegisterType<ServiceForSignalRHub>().AsImplementedInterfaces();
builder.RegisterType<...>().AsImplementedInterfaces();
builder.RegisterHubs(Assembly.GetExecutingAssembly());
IContainer container = builder.Build();
DependencyResolver.SetResolver(new AutofacDependencyResolver(container));
Run Code Online (Sandbox Code Playgroud)
然而,对 的调用.SetResolver(...)是不明确的,因为它存在于 MVC 和 SignalR 集成包中。怎么办?我无法确认我的服务的构造函数注入是否适用于我正在使用的集线器。
编辑
我可以使用 Autofac 配置 MVC5。我迷失的是如何使用 Autofac Signal 集成 NuGet 对 SignalR 执行相同的操作。请看下文。
这是我的启动课程:
public partial class Startup
{
public void Configuration(IAppBuilder app)
{
var defaultFactory = LogManager.Use<DefaultFactory>();
defaultFactory.Directory("@D:\\NServiceBus\\ );
defaultFactory.Level(LogLevel.Debug);
var container = …Run Code Online (Sandbox Code Playgroud) dependency-injection autofac signalr signalr-hub asp.net-mvc-5
我有一个MVC 4应用程序,我正在使用SignalR和依赖注入框架.因此,我需要实现自定义DependencyResolver.为了连线,我正在使用
var resolver = new CustomSignalRDependencyResolver(...);
GlobalHost.DependencyResolver = resolver;
app.MapSignalR();
Run Code Online (Sandbox Code Playgroud)
一切都按预期工作.但是,如果我使用这样的HubConfiguration对象:
var resolver = new CustomSignalRDependencyResolver(...);
app.MapSignalR(new HubConfiguration(
{
Resolver = resolver
});
Run Code Online (Sandbox Code Playgroud)
一切似乎都有效(对象正确连线,没有任何错误或警告)但远程方法不再被调用.有人可以解释第一种和第二种方法之间的区别吗?