2016-07-02 18 views
0

Ich arbeite in SignalR Chat Projekt like this examplewie SignalR

Es funktioniert gut, aber ich möchte machen Chat hub.cs in einem Web-API-Projekt und nennen es von anderen Kundenprojekten in Web-API arbeitet.

Ich habe nach Lösungen gesucht, habe aber keine gefunden. Wie erreiche ich das? Mein

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); 
     } 
    } 
} 

Antwort

0

ich eine separate Klassenbibliothek erstellt, die ich schließen und in allen meinen anderen Projekten verwenden, funktioniert gut und ermöglicht den Zugang zu einem einzigen wieder verwendbaren Hub. Ich benutze meine für Bestellbenachrichtigungen.

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; 
     } 

    } 
} 

Dann in keinem meiner anderen Projekte, die diese verwenden, nenne ich einfach:

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

ChatManager chatManager = new ChatManager();

Du kannst nicht in einem Hub tun. Hub-Instanzen sind nicht persistent, sie werden bei jeder einzelnen Anfrage neu erstellt, und auch Ihre ChatManager.

Um das zu ändern, konvertieren Sie Ihre ChatManager in eine Lazy Singleton. Ziel des Einsatzes von Faul in diesem Fall ist es sicher fädeln (recht ordentlich für 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 
} 

Dann von Ihrem Hub:

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

entschuldigen Sie mich es ist nicht mein Problem. Mein Problem ist, wie kann ich meinen Hub in API erstellen und es aus Client-Projekt aufrufen –