asp.net - Signalr 和 Nancyfx 集成

标签 asp.net .net session signalr nancy

我的应用程序流程如下(为清楚起见进行了简化):

  1. 用户从“/page1”获取一个页面
  2. 用户在页面上执行操作(添加文本、点击等),而 Signalr 将此数据传送到服务器,服务器在后台执行大量计算,并将这些结果返回到页面(让我们调用那些“X”)。
  3. 当用户完成页面时,他单击 Nancy 返回的指向“/page2”的链接。此页面是使用依赖于 X模型构建的。

那么,我该如何构建基于 X 的模型? signalr 如何以 Nancy 可以接受的方式写入用户 session ?

(我正在寻找一种“干净”的方式)

最佳答案

在 Signalr 和 Nancy 正式整合之前,这就是我带来的。基本上,我在两者之间共享一个 IOC 容器,并使用一个将用户映射到状态的对象(单例生命周期)。

如何使用内置的 TinyIOC 共享 IOC 容器:

  1. 扩展 Signalr 的 DefaultDependencyResolver

    public class TinyIoCDependencyResolver : DefaultDependencyResolver
    {
        private readonly TinyIoCContainer m_Container;
    
        public TinyIoCDependencyResolver(TinyIoCContainer container)
        {
            m_Container = container;
        }
    
        public override object GetService(Type serviceType)
        {
            return m_Container.CanResolve(serviceType) ? m_Container.Resolve(serviceType) : base.GetService(serviceType);
        }
    
        public override IEnumerable<object> GetServices(Type serviceType)
        {
            var objects = m_Container.CanResolve(serviceType) ? m_Container.ResolveAll(serviceType) : new object[] { };
            return objects.Concat(base.GetServices(serviceType));
        }
    }
    
  2. 将 Signalr 的默认 DependencyResolver 替换为我们的新 DependencyResolver

    public class Bootstrapper : DefaultNancyBootstrapper
    {
        protected override void ApplicationStartup(TinyIoCContainer container, IPipelines pipelines)
        {
            CookieBasedSessions.Enable(pipelines);
    
            // Replace UserToStateMap with your class of choice
            container.Register<IUserToStateMap, UserToStateMap>();
    
            GlobalHost.DependencyResolver = new TinyIoCDependencyResolver(container);
            RouteTable.Routes.MapHubs();
        }
    }
    
  3. 将 IUserToStateMap 添加为您的 hub 和 Nancy 模块中的依赖项

    public class MyModule : NancyModule
    {
        public MyModule(IUserToStateMap userToStateMap)
        {
            Get["/"] = o =>
            {
                var userId = Session["userId"];
                var state = userToStateMap[userId];
                return state.Foo;
            };
        }
    }
    
    public class MyHub : Hub
    {
        private readonly IUserToStateMap m_UserToStateMap;
    
        public MyHub(IUserToStateMap userToStateMap)
        {
            m_UserToStateMap = userToStateMap;
        }
    
        public string MySignalrMethod(string userId)
        {
            var state = userToStateMap[userId];
            return state.Bar;
        }
    }
    

我真正想要的是一种基于连接 ID 或类似的东西在两者之间轻松共享状态的方法,但与此同时,这个解决方案对我很有效。

关于asp.net - Signalr 和 Nancyfx 集成,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13817794/

相关文章:

asp.net - UpdatePanel 中的 Gridview 不会在 DOM 中呈现

c# - 将字符串转换为日期

c# - 检测 Windows Mobile 与 "plain"Windows CE

PHP - AJAX - 为什么文件访问是顺序的 - 无 session

javascript - 在单个页面上动态创建完整的一对多关系

c# - 通过 Javascript 设置 C# 属性值

ASP.NET 和 Silverlight 应用程序

c# - MessageBox 按钮 - 设置语言?

angularjs - session 到期时 SPA 重新登录

c# - 当我注销并单击浏览器后退按钮时,我仍然可以在 MVC4 应用程序中创建、编辑和删除用户