首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从服务器获取客户端数据的SignalR解决方案

从服务器获取客户端数据的SignalR解决方案
EN

Stack Overflow用户
提问于 2018-01-26 15:50:56
回答 1查看 3.9K关注 0票数 1

我知道,当调用来自服务器时,SignalR不能从客户端返回。在SignalR的github存储库中,我请求一个解决方案(https://github.com/aspnet/SignalR/issues/1329),他们建议我通过将它从客户机发送到服务器到集线器中的另一个方法来获得结果,所以使用TaskCompletionSource和一些连接元数据来捕获结果,但是我仍然无法理解如何做到这一点。

控制器服务器:

代码语言:javascript
复制
[HttpPut("send/{message}")]
public async Task<IActionResult> SendMessage(string message)
{
    if (!ModelState.IsValid) return BadRequest(ModelState.Values);

    string connectionId = Request.Headers["connectionId"];
    await _chatHubContext.Clients.Client(connectionId).InvokeAsync("send");

    // Catch the call of MessageReceived and get the chat status

    return new OkObjectResult(new EmptyJsonResult() { Result = "OK" }); 

}

枢纽服务器

代码语言:javascript
复制
public class ChatHub : Hub
{
    public Task MessageReceive(bool chatStatus)
    {
        // Tell controller that message is received
    }
}

角4客户端

代码语言:javascript
复制
import { Component, Inject } from '@angular/core';
import { HubConnection } from '@aspnet/signalr-client';

@Component({
  selector: 'chat',
  templateUrl: './chat.component.html',
  styleUrls: ['./chat.component.css']
})
/** chat component*/
export class ChatComponent {
  hubConnection: HubConnection;
  chatStatus = false;

  /** chat ctor */
  constructor( @Inject('BASE_URL') private originUrl: string) {
    this.hubConnection = new HubConnection(`${this.originUrl}chat`);

    setInterval(() => {
      this.chatStatus = !this.chatStatus;
    },
      5000);

    this.hubConnection
      .start()
      .then(() => {
        this.hubConnection.on('send', (message: string) => {
          if (this.chatStatus) {
            //send message
          }
          this.hubConnection
            .invoke('messageReceived', this.chatStatus);
        });
      });

  }
}

正如您在这段代码中所看到的,我不知道在控制器方法和集线器方法中应该做什么来知道方法MessageReceive是被调用的,并让他返回给控制器请求。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-01-29 14:10:01

“使用连接元数据和https://msdn.microsoft.com/en-us/library/dd449174(v=vs.110).aspx进行一些黑客操作,还可能会使其看起来很像一个返回值的方法调用。”

控制器服务器

注射HttpConnectionManager

代码语言:javascript
复制
// 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;
}

集线器服务器

代码语言:javascript
复制
public Task MessageReceived(bool chatStatus)
{
    Context.Items.TryGetValue("tcs", out object obj);

    var tcs = (TaskCompletionSource<bool>)obj;

    tcs.SetResult(chatStatus);

    return Task.CompletedTask;
}

角4客户端

代码语言:javascript
复制
// No change
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48464800

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档