Cách sử dụng phiên bản hub SignalR bên ngoài hubpipleline


79

Tôi đang sử dụng SignalR để truyền tin nhắn cho tất cả khách hàng của mình. Tôi cần kích hoạt phát sóng bên ngoài lớp trung tâm của mình, tức là một cái gì đó giống như dưới đây:

var broadcast = new chatHub(); broadcast.Send("Admin","stop the chat");

Tôi nhận được thông báo lỗi là:

Việc sử dụng phiên bản Hub không được tạo bởi HubPipeline không được hỗ trợ.

Câu trả lời:


139

Bạn cần sử dụng GetHubContext:

var context = GlobalHost.ConnectionManager.GetHubContext<chatHub>();
context.Clients.All.Send("Admin", "stop the chat");

Điều này được mô tả chi tiết hơn tại http://www.asp.net/signalr/overview/signalr-20/hubs-api/hubs-api-guide-server#callfromoutsidehub .


4
"context.Clients.All.Send" không phát lại cho người gọi, chỉ cho những người khác. bất kỳ ý tưởng?
user384080 28/12/13

4
Nếu bạn đang sử dụng GetHubContext, không có người gọi nào vì điều này được sử dụng bên ngoài Hub. Clients.Allnên giải quyết mọi ứng dụng khách hiện đang kết nối với Trung tâm.
73

5
Tôi có cùng một mã, nhưng phương thức Gửi hoặc bất kỳ phương thức nào khác sẽ không được gọi.
nAviD

5
Điều này không giúp bạn có được một phiên bản của trung tâm, nó cung cấp cho bạn một phiên bản của IHubContext. Bạn không thể sử dụng điều này để gọi các phương thức trung tâm.
George Mauer

4
Điều này phù hợp với tôi với MỘT thay đổi: context.Clients.All.broadcastMessage("Admin", "stop the chat"); Sử dụng broadcastMessage thay vì Send.
Wheel Builder

4

Một bản cập nhật nhỏ dành cho những ai có thể đang thắc mắc rằng cái GlobalHostđã biến đi đâu. SignalR đã được viết lại hoàn toàn cho lõi .net. Vì vậy, nếu bạn đang sử dụng gói SignalR.Core ( Sự khác biệt giữa các phiên bản SignalR ), bạn sẽ nhận được một phiên bản của ngữ cảnh trung tâm SignalR bằng cách đưa nó vào dịch vụ của bạn:

public class MyNeedyService
{
    private readonly IHubContext<MyHub> ctx;

    public MyNeedyService(IHubContext<MyHub> ctx)
    {
        this.ctx = ctx;
    }

    public async Task MyMethod()
    {
        await this.ctx.All.SendAsync("clientCall");
    }
}

Và trong Startup.cs:

services.AddSignalR()/*.AddAzureSignalR("...")*/;

Tài liệu của Microsoft ở đây: Gửi tin nhắn SignalR từ bên ngoài trung tâm .

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.