前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >asp dotnet core 实现服务器发送事件 Server-Sent Events 简单方式

asp dotnet core 实现服务器发送事件 Server-Sent Events 简单方式

作者头像
林德熙
发布2022-08-04 18:11:56
6870
发布2022-08-04 18:11:56
举报
文章被收录于专栏:林德熙的博客林德熙的博客

在客户端开发时可以通过轮询的方式拿到服务器端的数据,同时在客户端开发时,如果是将客户端也作为服务器端,那么之间的通讯将会十分简单。有个逗比的小伙伴想要用我的客户端魔改,但是他又不想学习什么知识,此时他需要拿到我客户端的实时信息,好在他知道一点 html 的知识,于是让我通过服务器发送事件 Server-Sent Events 而他写一个简陋的 html 去拿到我客户端的数据 这是一个简陋的开发端的工具,开源的好处就是,你觉得不爽,自己改哇。自己改不动就等开发者下班协助啦,本文就使用一个简单的方式在 asp dotnet core 实现服务器发送事件。虽然标题是 asp dotnet core 而实际上我的软件是一个桌面端软件

其实服务器发送事件 Server-Sent Events 原理就是在请求发送的 stream 设置 Content-Typetext/event-stream 然后不断写入数据就可以了

新建一个控制器,在控制台里面的调用方法,注意需要是 get 方法哦(其实没有限制)这样写起来才简单

代码语言:javascript
复制
    [ApiController]
    [Route("[controller]")]
    public class FooController : ControllerBase
    {
        [HttpGet]
        public async Task Get()
        {

        }

通过 Response 属性可以拿到请求,在 Header 添加 Content-Type 这样就可以告诉调用者返回的是服务器发送事件

代码语言:javascript
复制
            var response = Response;
            response.Headers.Add("Content-Type", "text/event-stream");

不断给调用者发送数据的方法就是不断写入数据

代码语言:javascript
复制
                await response
                    .WriteAsync($"data: 当前时间 {DateTime.Now} {Thread.CurrentThread.ManagedThreadId}\r\r");

注意写入数据的格式,要求是 data: 信息 \r\r 如果格式不对,那么调用方是接收不到数据

写入数据之后需要发送

代码语言:javascript
复制
                response.Body.Flush();

如不断告诉调用方更新时间可以这样写

代码语言:javascript
复制
        [HttpGet]
        public async Task Get()
        {
            var response = Response;
            response.Headers.Add("Content-Type", "text/event-stream");

            for (var i = 0; ; ++i)
            {
                await response
                    .WriteAsync($"data: 当前时间 {DateTime.Now} {Thread.CurrentThread.ManagedThreadId}\r\r");

                response.Body.Flush();
                await Task.Delay(TimeSpan.FromSeconds(1));
            }
        }

上面的代码请不要放在实际项目,因为方法被调用就不会停下

此时调用者就可以使用简单的方法拿到服务器发送的数据

本文代码放在 github 下载代码运行,访问 http://localhost:端口/index.html 就可以看到网页不断刷新时间

当然更好的通讯方法是通过 Pipe 的方式通讯,可选框架是 WCF 等

如果是现代的开发,建议使用 SignalR 的方法发送数据,其实 SignalR 底层传输是 Web Socket, Server Sent Events 和 Long Polling 方法

.net core HTML5支持服务器发送事件(Server-Sent Events)-单向消息传递数据推送(C#示例)

本文开始标题是 WPF 发送Server-Sent Events给其他进程,但是实际上没有用到 WPF 的任何内容,于是修改了标题。如果你是因为工作需要用到这个技术,搜到本文,如果还有精力,那么我推荐你看一下 WCF 或 SignalR 的方法。如果没有,那么本文的代码也请不要抄,因为上面的代码会让方法不断运行

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档