鼎鼎知识库
選択できるのは25トピックまでです。 トピックは、先頭が英数字で、英数字とダッシュ('-')を使用した35文字以内のものにしてください。

客户端和服务端之间的长连接.md 1.6KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768
  1. > 当我们使用浏览器浏览网页,是否考虑过浏览器和服务端的交互模型。
  2. ![客户端和服务端交互模型](client_server.jpg)
  3. 有时候,我们希望没有请求,客户端也能获取到数据,比如我们的报警版大屏、炒股的大盘。
  4. ![大屏](big_screen.png)
  5. <div align=center>
  6. <img src="dapan.jpg" width="">
  7. </div>
  8. > 长连接背后的原理是什么呢?
  9. ![SignalR](signalr.jpg)
  10. > SignalR就是对长连接的封装
  11. 双向的、持久的连接。
  12. > 代码层面
  13. 如果我们封装了一个组件,该如何使用它呢?
  14. 依赖注入是后端开发中很重要的思想。
  15. 首先把需要用到的服务注入到容器中。
  16. ```
  17. public void ConfigureServices(IServiceCollection services)
  18. {
  19. services.AddSignalR();
  20. ......
  21. }
  22. ```
  23. 本质上是把接口和实现的关系注入到容器中。
  24. ![IOC](ioc.png)
  25. 当在接口中调用SingnalR的某些方法时,只需要从容器中取出接口即可,这样实现了接口和服务的松耦合。
  26. ```
  27. [Route("api/broadcast")]
  28. [ApiController]
  29. public class BroadcastController : ControllerBase
  30. {
  31. private readonly IHubContext<ChatHub> _hub;
  32. public BroadcastController(IHubContext<ChatHub> hub)
  33. {
  34. _hub = hub;
  35. }
  36. [HttpGet]
  37. public async Task Get(string user, string message)
  38. {
  39. await _hub.Clients.All.SendAsync("ReceiveMessage", user, message);
  40. }
  41. }
  42. ```
  43. > 总结
  44. - 本篇从客户端和服务端的交互模式开始
  45. - 谈到了需要长连接的场景
  46. - SingalR的封装
  47. - 依赖注入,更到低管理接口和服务,实现低耦合