信令服务器 -->客户端调用不起作用



我目前使用SignalR在服务器和由服务器本身产生的多个独立进程之间进行通信。服务器&客户端是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);
    }
}

在客户端,我这样注册:

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 = m_hubConnection.CreateHubProxy(AgentConstants.ManagementHub.Name);
        m_managementHubProxy.On("closeRequested", CloseRequestedCallback);
        await m_hubConnection.Start();
    }
    catch (Exception e)
    {
        m_logger.Error("Exception encountered in Connect method", e);
    }
}

在服务器端,我以以下方式发送关闭请求:

var managementHub = GlobalHost.ConnectionManager.GetHubContext<ManagementHub>();
managementHub.Clients.All.closeRequested();

我从未在CloseRequestedCallback中收到任何回调。无论是在客户端还是在服务器端,我都没有在日志中得到任何错误。

我哪里做错了?

编辑09/10/15

经过一些研究和修改,我发现这与更换IoC容器有关。当我删除链接到LightInject的所有内容并原样使用SignalR时,一切都工作了。我对此感到很惊讶,因为LightInject记录了他们与SignalR的集成。

在我发现这个之后,我意识到GlobalHost.DependencyResolver与我提供给HubConfiguration的不一样。有一次我添加了

GlobalHost.DependencyResolver = config.Resolver;

之前
app.MapSignalR("", config);

我现在在CloseRequestedCallback内接收回调。不幸的是,当我从客户机向服务器调用一个方法时,我得到了以下错误:

Microsoft.AspNet.SignalR.Client.Infrastructure.SlowCallbackException

检测到可能的死锁。一个注册为HubProxy的回调函数。在"或"连接。已执行至少10秒

我不确定我找到的修复程序以及它可能对系统产生的影响。可以用我自己的GlobalHost.DependencyResolver替换而不注册其所有默认内容吗?

编辑2 09/10/15

根据这一点,改变GlobalHost.DependencyResolver是正确的事情。仍然没有解释SlowCallbackException,因为我在所有回调中都没有做任何事情。

Issue 1: IoC容器+依赖注入

如果您想更改HubConfiguration的IoC,您还需要更改GlobalHost的IoC,以便在上下文之外请求时返回相同的集线器。

Issue 2: Unexpected SlowCallbackException

这个异常是由于我在控制台应用程序中使用SignalR引起的。应用程序的入口点不能是一个async方法,所以能够异步调用我的初始配置,我做了如下:

private static int Main()
{
    var t = InitAsync();
    t.Wait();
    return t.Result;
}

对我来说不幸的是,这会导致这里描述的许多问题&在这里有更多细节。

启动我的InitAsync如下:

private static int Main()
{
    Task.Factory.StartNew(async ()=> await InitAsync());
    m_waitInitCompletedRequest.WaitOne(TimeSpan.FromSeconds(30));
    return (int)EndpointErrorCode.Ended;
}

现在一切运行正常,我没有任何死锁。

有关问题的更多详细信息&答案,你也可以参考我问题中的编辑

相关内容

  • 没有找到相关文章

最新更新