在Controller或Views之外访问Cloudscribe SiteID

时间:2017-10-18 23:26:49

标签: asp.net-core-mvc asp.net-core-signalr cloudscribe

我有class我希望获得Cloudscribe SiteId,但我不确定如何访问它。

如果我使用的是controller,那么我可以依赖SiteContext将DI作为构造函数,但在此实例中不起作用。

有人可以告诉我如何在下面的代码中访问SiteId属性吗?

using Microsoft.AspNetCore.SignalR;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;

namespace CoLabR
{
    public class Messaging : Hub
    {
        private string _siteId;

        public Messaging()
        {
            //Code here to get SiteID
            _siteId = "<<Code for getting Site ID";
        }

        public Task Post(string message)
        {

            return Clients.Group(_siteId).InvokeAsync("Post", message);
        }

        public Task JoinRoom()
        {
            Groups.AddAsync(Context.ConnectionId, _siteId);
            return Clients.Group(_siteId).InvokeAsync("Post", Context.User.Identity.Name + " joined. " + _siteId);
        }

    }
}

2 个答案:

答案 0 :(得分:1)

SignalR Core支持注入集线器,因此您应该只能将SiteContext注入MessagingHere是一个相关问题,展示了如何做到这一点。

答案 1 :(得分:0)

虽然@Pawel的回答对我有所帮助,但我的最终解决方案却有所不同。我尝试在我的SiteContext中注册Startup.cs并将SiteContext注入我的Hub的构造函数中,但它在每次页面加载时都会返回不同的SiteID(或者如果我使用Singleton它给了我相同的跨多个CloudScribe站点的SiteId。)

最后,我的解决方案是将Hub构造函数更改为以下代码

    public Messaging(SiteUserManager<SiteUser> userManager)
    {
        //Code here to get SiteID
        _siteId = userManager.Site.Id.ToString();
    }

这为我的申请中的每个租户网站提供了一致的SiteId。