![](/img/trans.png)
[英]How to use SignalR 2 with WEB API, calling SignalR methods from API and from Clients
[英]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.