“通过对连接元数据和
TaskCompletionSource
您还可以使其看起来很像返回值的方法调用。"
控制器服务器
:
注射
HttpConnectionManager
.
// using Microsoft.AspNetCore.Http.Connections.Internal;
public async Task<IActionResult> SendMessage(string message)
{
string connectionId = Request.Headers["connectionId"];
var chatStatus = await Send(connectionId, message);
return new OkObjectResult(new { Result = "OK", ChatStatus = chatStatus });
}
private async Task<bool> Send(string connectionId, string message)
{
var tcs = new TaskCompletionSource<bool>();
_connectionManager.TryGetConnection(connectionId, out HttpConnectionContext connection);
connection.Items.Add("tcs", tcs);
await _chatHubContext.Clients.Client(connectionId).SendAsync("send", message);
var chatStatus = await tcs.Task;
connection.Items.Remove("tcs");
return chatStatus;
}
集线器服务器
:
public Task MessageReceived(bool chatStatus)
{
Context.Items.TryGetValue("tcs", out object obj);
var tcs = (TaskCompletionSource<bool>)obj;
tcs.SetResult(chatStatus);
return Task.CompletedTask;
}
Angular 4客户端
:
// No change