2017-02-17 303 views
19

主要目标是添加网站发送Web通知的能力,弹出系统通知以使用Html5推送API和服务工作人员提醒用户。 不使用SignalR,它只能在站点打开时运行客户端脚本。也应该能够发送通知,如果网站已关闭,如上所述here - 这是可能的。Asp Net核心Web推送通知

Here即将推式API好文章,并提供了良好的example 但它使用的的NodeJS服务器和web-push组件将请求发送到通知服务。

找不到任何.NET示例。我想到了两种解决方法。

首先,是写一切从基础上推式API文章note有关服务器划伤:

当您发送到无数据的推送消息,你可以将它发送到使用HTTP POST请求的端点URL。但是,当推送消息包含数据时,您需要对其进行加密,这是一个非常复杂的过程。

其次,就是用AspNetCore.NodeServices(article它)来执行的node.js脚本文件

是否有更多的解决方案?也许存在这样的现成解决方案?

学科研究

3案件后:

  1. HTTP +旧的浏览器+ IE所有版本 - 使用SignalR +渲染使用通知HTML + JS
  2. HTTP +现代浏览器(Chrome浏览器, Firefox,Safary,Opera?,Edge)支持Notification API。 - 使用SignalR并使用js触发原生浏览器通知使用new Notification('Message')
  3. 支持Push API的HTTPS + Chrome(Mobile)可使用服务工作人员触发关闭站点的本机通知。 Chrome的移动版本只能使用服务人员创建通知。

变得复杂了。哪里不对?

可能的解决方案:

对于1,2例发现this库。认为这是一个良好的前端解决方案,具有良好的后备支持。 3例仍不知如何是好。

当前的解决方案。补充:2017年11月22日

  • 没有离线客户通知支持
  • 没有移动支持
  • 使用Chrome V62 +移动所有项目HTTPS - link
  • 使用SignalR(0.2。0)用于发送推送到在线客户端
  • 使用pnotify v3 +显示本机桌面或html通知。
  • 等待pnotify V4.0.0(作者承诺Chrome移动设备的支持。Issue
  • 等待.NET 2.1的核心与SignalR 1.0到整个项目重写它。
+4

你有什么理由不使用SignalR - 这将是能够从后台,在那里你然后在回调与反应通知你的客户HTML5推送API。 –

+0

客户希望通过从服务工作者脚本调用ServiceWorkerRegistration.showNotification生成的浏览器在移动设备和桌面上查看浏览器通知。因此,SignallR可以调用它,然后网站当前打开,但如果它关闭,则需要通知API。 – aleha

+0

您可以使用[Pushpad](https://pushpad.xyz/docs/pushpad_pro_getting_started)及其[REST API](https://pushpad.xyz/docs/rest_api)(请参阅'POST/projects/PROJECT_ID/notifications' )。 – collimarco

回答

3

您提到的节点库已移植到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:[email protected]"; 
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); 
} 
+0

pushEndpoint针对googleapis意味着它只能在chrome中工作? – aleha

+0

您需要一个不同的端点来定位Firefox。在该项目的自述文件中有一个浏览器支持表。 –