ASP.NET Core Web 推送通知

42
主要目标是为网站添加能够使用Html5 Push API和服务工作程序发送Web通知以弹出系统通知以警示用户的功能。不使用仅在网站打开时运行客户端脚本的SignalR。同时,应该可以在网站关闭时发送通知,如此处所述-这是可能的。 这里是关于Push API的好文章,并提供了示例,但它使用NodeJS作为服务器,并使用web-push组件向通知服务发送请求。
找不到任何.NET示例。我考虑两种解决方法。
第一种是根据Push API文章中有关服务器的注释从头开始编写所有内容:

当您发送不带数据的推送消息时,只需使用HTTP POST请求将其发送到终端点URL即可。但是,当推送消息包含数据时,您需要对其进行加密,这是一个相当复杂的过程。

第二种是使用AspNetCore.NodeServices(关于它的文章)执行node.js脚本文件。
还有其他解决方案吗?也许存在针对此问题的现成解决方案? 主题研究后 3种情况:
1. HTTP +旧版浏览器+ IE所有版本-使用SignalR +使用html + js渲染通知 2. 使用新式浏览器-使用Push API和服务工作程序 3. 后备方案-使用WebSockets和SignalR。
  • HTTP + 现代浏览器(Chrome,Firefox,Safari,Opera?,Edge)支持使用 Notification API。- 使用 SignalR 和JS触发原生浏览器通知,使用 new Notification('Message')
  • HTTPS + Chrome(移动版)支持使用 Push API 触发服务工作者的闭合站点本地通知。移动版 Chrome 只能使用服务工作者创建通知。
  • 变得太复杂了。有什么问题?

    可能的解决方案:

    对于第1和2种情况,找到了这个仓库。认为这是一个很好的前端解决方案,具有良好的回退支持。 对于第3中情况,还不知道该怎么办。

    当前解决方案。添加日期:2017-11-22

    • 没有离线客户端通知支持
    • 没有移动支持
    • 对于 Chrome v62+,将所有项目移至https -链接
    • 使用 SignalR (0.2.0) 发送推送到在线客户端
    • 使用pnotify v3+ 显示本机桌面或 HTML 通知。
    • 等待pnotify v4.0.0(作者承诺 Chrome 移动支持。 Issue
    • 等待 .NET Core 2.1 和 SignalR 1.0 重写整个项目。

    4
    你不使用SignalR的原因是什么?SignalR可以从后端通知你的客户端,然后你可以使用HTML5 Push API在回调函数中进行反应。 - Andre Andersen
    你可以使用Pushpad和它的REST API(参见POST /projects/PROJECT_ID/notifications)。 - collimarco
    1
    @collimarco 使用第三方服务并不是最佳选择。 - aleha_84
    1
    @aleha 当然,选择取决于您的需求。请注意它依赖于Push API,而不是使用奇怪的专有协议构建。 - collimarco
    1
    我不确定这是否符合您的要求,但我们已经使用web-push-csharp几个月来发送带有效负载的网络推送。它是您提到的node库的端口。但它只适用于现代Chrome、Firefox和Opera浏览器。 - Ángela
    显示剩余9条评论
    2个回答

    15

    你提到的节点库已经移植到C#:web-push-csharp

    以下是他们网站上直接摘取的使用示例:

    var pushEndpoint = @"https://fcm.googleapis.com/fcm/send/efz_TLX_rLU:APA91bE6U0iybLYvv0F3mf6uDLB6....";
    var p256dh = @"BKK18ZjtENC4jdhAAg9OfJacySQiDVcXMamy3SKKy7FwJcI5E0DKO9v4V2Pb8NnAPN4EVdmhO............";
    var auth = @"fkJatBBEl...............";
    
    var subject = @"mailto:example@example.com";
    var publicKey = @"BDjASz8kkVBQJgWcD05uX3VxIs_gSHyuS023jnBoHBgUbg8zIJvTSQytR8MP4Z3-kzcGNVnM...............";
    var privateKey = @"mryM-krWj_6IsIMGsd8wNFXGBxnx...............";
    
    var subscription = new PushSubscription(pushEndpoint, p256dh, auth);
    var vapidDetails = new VapidDetails(subject, publicKey, privateKey);
    
    var webPushClient = new WebPushClient();
    try
    {
        webPushClient.SendNotification(subscription, "payload", vapidDetails);
    }
    catch (WebPushException exception)
    {
        Console.WriteLine("Http STATUS code" + exception.StatusCode);
    }
    

    pushEndpoint针对googleapis的目标是它只能在Chrome中工作吗? - aleha_84
    你需要一个不同的端点来针对Firefox。在项目的自述文件中有一个浏览器支持表格。 - Ángela
    请问您能否提供一些样例代码,以便通过ASP.NET MVC/.NET Core订阅Chrome推送通知呢?我已经开始使用这个实验室 https://developers.google.com/web/fundamentals/codelabs/push-notifications/ ,但我需要在.NET中清晰地了解服务器端的实现。谢谢! - NoWar
    也许你可以帮忙解答 https://stackoverflow.com/questions/62673508/how-web-push-protocol-works - zolty13

    3

    适用于Web、Android和iOS的CorePush库

    我建议使用CorePush库。它具有非常简单的接口,轻量级并支持所有内容,例如Web、iOS和Android。以下是如何通过Firebase发送Web Push的示例:

    var fcm = new FcmSender(settings, httpClient);
    await fcm.SendAsync(deviceToken, notification);
    

    这个库看起来相当不错,但我对它的维护支持时间有所疑虑,不过还是要试一试。 - Bùi Quang Tuấn
    3
    嗨@BùiQuangTuấn!感谢您尝试使用!该库是由我开发的,并且被我们公司广泛使用。我非常确定它将得到长期支持。 - Andrei

    网页内容由stack overflow 提供, 点击上面的
    可以查看英文原文,
    原文链接