簡體   English   中英

SignalR如何在Web API中工作

[英]how SignalR works in Web API

我正在像這個例子一樣在SignalR聊天項目中工作

但是它運行良好,我想在Web API項目中創建chat hub.cs並從其他客戶端項目中調用它。

我已經搜索了解決方案,但沒有找到任何解決方案。 我該如何實現。

我的chatHub

public class ChatHub : Hub
{
        dbcontext db = new dbcontext();
        ChatManager chatManager = new ChatManager();
    public static string ConnectionId = null;

    public void Send(string name, string message)
    {
        ConnectedUsers cu = chatManager.getCurrentUserRow(Context.ConnectionId);

        if (cu != null)
        {
            string L_ConnectionId = cu.Other_ConnectionId;

            Clients.Client(L_ConnectionId)
                .addNewMessageToPage(name, message);
        }
    }
    public override Task OnConnected()
    {
        Console.WriteLine("Connected user: " + Context.User.Identity.Name);
        ConnectionId = Context.ConnectionId;
        chatManager.AddAndRemoveUser(true, Context.ConnectionId); // to add user in connectedUser Table
        chatManager.OpenRandomChat(Context.ConnectionId);

        return base.OnConnected();
    }
    public override Task OnDisconnected(bool stopCalled)
    {
        chatManager.RemoveLeftUser(Context.ConnectionId);
        chatManager.AddAndRemoveUser(false, Context.ConnectionId);
        return base.OnDisconnected(stopCalled);
    }
    public override Task OnReconnected()
    {
        Console.WriteLine("ReConnected user: " + Context.User.Identity.Name);
        return base.OnReconnected();
    }
    public void NewConnection()
    {
        int retVal = -1;
        chatManager.RemoveLeftUser(Context.ConnectionId); // to remove left user from 2 users
        chatManager.OpenRandomChat(Context.ConnectionId); // to chosse random user for me 

        // to get me and my if i have partner ..
        ConnectedUsers cu = chatManager.getCurrentUserRow(Context.ConnectionId);

        if (cu != null)
        {
            retVal = 0;
            //string groupId = cu.ConnectionId + cu.Other_ConnectionId;
            //string R_ConnectionId = cu.ConnectionId;
            string L_ConnectionId = cu.Other_ConnectionId;
        }
        Clients.Client(Context.ConnectionId)
              .sendGroupData(retVal);
    }

    public void SendQuestion(string question)
    {
        ConnectedUsers cu = chatManager.getCurrentUserRow(Context.ConnectionId);
        if (cu != null)
        {
            string L_ConnectionId = cu.Other_ConnectionId;
            Clients.Client(L_ConnectionId)
                .sendQuestion(question);
        }
    }
    public void AnswerQuestion(string answer)
    {
        ConnectedUsers cu = chatManager.getCurrentUserRow(Context.ConnectionId);
        if (cu != null)
        {
            string L_ConnectionId = cu.Other_ConnectionId;

            Clients.Client(L_ConnectionId)
                .answerQuestion(answer);
        }
    }
}

我創建了一個單獨的類庫,該類庫在我的任何其他項目中都包含和使用,效果很好,並且可以訪問單個可重用的Hub。 我使用我的訂單通知。

 namespace MyProjects.SignalR.Hubs
{
    public class OrdersHub : Hub
    {


        public void OrderDeleted(int manufacturerId, int orderId)
        {
            Clients.Group(OrdersGroup(manufacturerId)).BroadcastOrder(orderId);
        }


        public Task JoinOrders(int manufacturerId)
        {
            return Groups.Add(Context.ConnectionId, OrdersGroup(manufacturerId));
        }

        private string OrdersGroup(int manufacturerId)
        {
            return "orders" + manufacturerId;
        }

    }
}

然后,在其他任何使用此功能的項目中,我只需調用:

var ordersHubContext = GlobalHost.ConnectionManager.GetHubContext<OrdersHub>();
ordersHubContext.Clients.All.OrderDeleted(order.ManufacturerID, order.OrderID);

ChatManager chatManager = new ChatManager();

您無法在集線器中執行此操作。 集線器實例不是持久性的,它們是在每個單個請求上都重新創建的,您的ChatManager也是如此。

為此,請將您的ChatManager轉換為Lazy單例。 在這種情況下使用Lazy的目的是使其線程安全(對於SignalR而言,它非常簡潔):

public sealed class ChatManager
{
    private static readonly Lazy< ChatManager > lazy =
        new Lazy< ChatManager >(() => new ChatManager());

    public static ChatManager Instance { get { return lazy.Value; } }

    private ChatManager()
    {
    }

    // TODO add your methods here
}

然后,從您的中心:

ChatManager.Instance.AddAndRemoveUser(true, Context.ConnectionId);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM