2013-07-08 36 views
11

Đây là mã Hub tôi:phương pháp Gọi Hub trong C# mã

public class Pusher : Hub, IPusher 
     { 
      readonly IHubContext _hubContext = GlobalHost.ConnectionManager.GetHubContext<Pusher>(); 

    public virtual Task PushToOtherInGroup(dynamic group, dynamic data) 
     { 
      return _hubContext.Clients.Group(group).GetData(data); 
     } 
     } 

Tôi muốn gọi phương pháp này trong một dự án khác với mã này:

var pusher = new Pusher.Pusher(); 
     pusher.PushToOtherInGroup("Test", new {exchangeTypeId, price}); 

Tôi muốn gọi PushToOtherInGroup, khi gọi phương pháp này tôi không nhận được bất kỳ lỗi nào. nhưng máy in không hoạt động.

Đây là Mã Ui tôi:

$(function() { 
    hub = $.connection.pusher; 
    $.connection.hub.start() 
     .done(function() { 
      hub.server.subscribe('newPrice'); 
      console.log('Now connected, connection ID=' + $.connection.hub.id); 
     }) 
     .fail(function() { console.log('Could not Connect!'); }); 
}); 

    (function() { 
      hub.client.GetData = function (data) { 
       debugger; 
      }; 
     }); 

vấn đề của tôi là gì?

Trả lời

17

Bạn không thể nhanh chóng và gọi một lớp trung tâm trực tiếp như thế. Có nhiều đường ống dẫn nước được cung cấp xung quanh một lớp Hub bởi thời gian chạy SignalR mà bạn đang bỏ qua bằng cách sử dụng nó như là một "lớp đồng bằng cũ" như thế.

Cách duy nhất để tương tác với một trung tâm SignalR từ bên ngoài là thực sự có được một thể hiện của một IHubContext đại diện cho trung tâm từ thời gian chạy SignalR. Bạn chỉ có thể làm điều này từ bên trong cùng một quá trình, miễn là "dự án" khác của bạn sẽ chạy trong quá trình với mã SignalR nó sẽ hoạt động.

Nếu dự án khác của bạn đang chạy trong một quy trình khác thì điều bạn muốn làm là hiển thị một loại API "đồng hành" là trung tâm SignalR khác hoặc dịch vụ web cũ thông thường (với web ASP.NET API) mà bạn có thể gọi từ ứng dụng khác này để kích hoạt hành vi bạn muốn. Cho dù bạn chọn công nghệ nào, bạn có thể muốn bảo mật điều này để chỉ các ứng dụng được xác thực của bạn mới có thể gọi nó.

Khi bạn quyết định tiếp cận bạn sẽ mất, tất cả các bạn sẽ làm gì để gửi tin nhắn ra qua trung tâm Pusher sẽ là:

// Get the context for the Pusher hub 
IHubContext hubContext = GlobalHost.ConnectionManager.GetHubContext<Pusher>(); 

// Notify clients in the group 
hubContext.Clients.Group(group).GetData(data); 
6

Nếu bạn đang tìm cách gọi một phương thức trong trung tâm của mình từ một dự án khác thì nó cần phải nằm trong cùng một miền ứng dụng. Nếu có thì đây là cách bạn có thể làm điều đó:

Call a hub method from a controller's action (không nhớ tên, nó hoạt động cho kịch bản của bạn)

1

Hãy xem this liên kết ở chủ đề (Làm thế nào để gọi các phương thức máy khách và quản lý các nhóm từ bên ngoài lớp Hub).
Ví dụ về mã chỉ đơn giản là tạo ra một cá thể đơn lẻ của lớp người gọi và chuyển trong hàm IHubContext vào hàm tạo của nó. Sau đó, bạn có quyền truy cập vào mong muốn context.Clients trong các phương thức của người gọi:

// This sample only shows code related to getting and using the SignalR context. 
public class StockTicker 
{ 
    // Singleton instance 
    private readonly static Lazy<StockTicker> _instance = new  Lazy<StockTicker>(() => new StockTicker(GlobalHost.ConnectionManager.GetHubContext<StockTickerHub>())); 

private IHubContext _context; 

private StockTicker(IHubContext context) 
{ 
    _context = context; 
} 

// This method is invoked by a Timer object. 
private void UpdateStockPrices(object state) 
{ 
    foreach (var stock in _stocks.Values) 
    { 
     if (TryUpdateStockPrice(stock)) 
     { 
      _context.Clients.All.updateStockPrice(stock); 
     } 
    } 
} 
Các vấn đề liên quan