Tôi có một dự án web yêu cầu số liệu thống kê/nhật ký trên trang web được cập nhật từ dịch vụ xà phòng bên ngoài. Cách tiếp cận mà tôi đã quyết định thực hiện với điều này là sử dụng signalR, bằng cách mã có thể thực hiện một phương thức dịch vụ và trả về kết quả cho tất cả các máy khách được kết nối. Mã này sẽ được thực hiện liên tục, với sự chậm trễ giữa các cuộc gọi dịch vụ.Nhắn tin liên tục SignalR
Tôi đang gặp khó khăn khi đặt tất cả các phần lại với nhau, có lẽ vì tôi không chắc chắn mọi thứ nên đi! Đây là một sự cố thô vào những gì tôi đã làm cho đến nay
class Data { ... }
interface IDataService
{
Task GetDataAsync(TimeSpan interval, CancellationToken cancellationToken, Action<Data> callback);
}
class DataService : IDataService
{
private readonly ExternalService _externalService;
public async Task GetDataAsync(TimeSpan interval, CancellationToken cancellationToken, Action<Data> callback)
{
while (!cancellationToken.IsCancellationRequested)
{
var data = await this._externalService.GetData();
callback(data);
await Task.Delay(interval).ConfigureAwait(false);
}
}
}
Vì vậy, ở trên là logic mà được dữ liệu từ các dịch vụ bên ngoài, và thực hiện một cuộc gọi lại. Đối với signalR, điều duy nhất tôi đã làm như sau
public class DataHub : Hub
{
private readonly IDataService _service;
public DataHub(IDataService service)
{
this._service = service;
}
public async Task GetData()
{
var tenSeconds = new TimeSpan(0, 0, 10);
var token = new CancellationToken();
await _service.GetDataAsync(tenSeconds, token, d =>
{
// signal all connected clients
});
}
}
Phương pháp GetData()
có thể được gọi khi khách hàng kết nối (nếu nó chưa được chạy) và các thẻ có thể bị hủy bỏ khi không có nhiều khách hàng hơn được kết nối với trung tâm.
(tiềm năng) Vấn đề:
- hub SignalR không độc thân chúng là gì? Tôi cho rằng chúng được tạo ra khi cần và xử lý khi không cần nữa (yêu cầu đã hoàn thành). Trong trường hợp này, tôi sẽ có nhiều trường hợp của phương thức
GetData
đang chạy (trừ khi tôi làm cho lớp DataService là một singleton/được tiêm dưới dạng một singleton). - Trung tâm không giống như nơi thích hợp để thực hiện việc này. Một trung tâm nên được xử lý như một bộ điều khiển MVC/Web Api? Vì vậy, một yêu cầu đến, hub xử lý nó, yêu cầu được hoàn thành. Kết thúc câu chuyện.
- Một cách khác để thực hiện việc này là chuyển trung tâm vào dịch vụ dữ liệu. Và sau đó nó có thể gọi cho khách hàng. Nhưng tôi không thực sự muốn đi qua các đối tượng IHubContext. Tôi muốn giữ dịch vụ càng đơn giản càng tốt.
- Tác vụ nền ASP.NET có phù hợp hơn ở đây không?
Xin cảm ơn nếu ai đó có thể chỉ cho tôi đúng/cách tiếp cận tốt nhất!
* Chào mừng bạn đến với StackOverflow! * Vui lòng xem ["Câu hỏi có nên bao gồm" thẻ "trong tiêu đề của họ không?"] (Http://meta.stackexchange.com/questions/19190/should-questions-include-tags-in- danh hiệu của họ), nơi sự đồng thuận là "không, họ không nên". –