Vapid.NET
0.1.0
dotnet add package Vapid.NET --version 0.1.0
NuGet\Install-Package Vapid.NET -Version 0.1.0
This command is intended to be used within the Package Manager Console in Visual Studio, as it uses the NuGet module's version of Install-Package.
<PackageReference Include="Vapid.NET" Version="0.1.0" />
For projects that support PackageReference, copy this XML node into the project file to reference the package.
<PackageVersion Include="Vapid.NET" Version="0.1.0" />
<PackageReference Include="Vapid.NET" />
For projects that support Central Package Management (CPM), copy this XML node into the solution Directory.Packages.props file to version the package.
paket add Vapid.NET --version 0.1.0
The NuGet Team does not provide support for this client. Please contact its maintainers for support.
#r "nuget: Vapid.NET, 0.1.0"
#r directive can be used in F# Interactive and Polyglot Notebooks. Copy this into the interactive tool or source code of the script to reference the package.
#:package Vapid.NET@0.1.0
#:package directive can be used in C# file-based apps starting in .NET 10 preview 4. Copy this into a .cs file before any lines of code to reference the package.
#addin nuget:?package=Vapid.NET&version=0.1.0
#tool nuget:?package=Vapid.NET&version=0.1.0
The NuGet Team does not provide support for this client. Please contact its maintainers for support.
Vapid.NET
A minimal, no dependency Vapid WebPush client for .NET.
Motivation
The original/most popular WebPush client for .NET has multiple issues (in my opinion):
- It uses the
Portable.BouncyCastlepackage.- This package was made before .NET had built-in Cryptography functions that WebPush requires.
- There is a pull request that tries to fix this, however, this code uses Windows-only functions and hasn't been updated to resolve this issue.
- It uses the
Newtonsoft.Jsonpackage.- Again, this package was made before .NET had efficient built-in JSON parsing.
- The (current) latest
masterbranch has received a commit to remove this package, however, the package hasn't been updated since July 2021.
- It can allocate quite some data in memory.
- You are almost required to write a wrapper around this package to make it more developer-friendly.
Features
- Lightweight package that has little to no dependencies
- Faster than web-push-csharp when creating HTTP requests.
- The speed of this library is almost completely dependent on the speed of the WebPush server.
- Declarative Web Push support.
- Clean and developer-friendly API.
Missing features
- No GCM support.
- Even though GCM support seems redundant, an application might still need it.
Usage
ASP.NET Core: Server
- Configure Vapid options and register the Vapid client for DI:
using Vapid.NET;
services.Configure<VapidOptions>((options) =>
{
// You can generate this information on the following website:
// https://vapidkeys.com
options.Subject = "…"; // Most of the time, this is an `mailto:…` address.
options.PublicKey = "…";
options.PrivateKey = "…";
});
services.AddHttpClient<VapidClient>("Vapid WebPush");
- Send a push notification:
using Vapid.NET;
using Vapid.NET.Models;
// Don't forget to inject the `VapidClient`.
// You'd probably store and fetch this from a database:
var pushSubscription = new PushSubscription
{
Endpoint = "…",
P256dh = "…",
Auth = "…",
};
var notification = new PushNotification
{
Title = "Vapid.NET",
Body = "Hello from the server!",
Navigate = "https://vapid.net/docs",
};
// `SendAsync` returns a boolean indicating if the push notification was sent.
var sent = await client.SendAsync(pushSubscription, notification, /*optional:*/ cancellationToken);
ASP.NET Core: Client
Push notifications are sent using the Declarative Web
Push format. But not a lot of browsers
support this format (yet). You should make sure your application has a service worker that handles the push event:
self.addEventListener('push', function (event) {
event.waitUntil(showNotification(event));
});
self.addEventListener('notificationclick', function (event) {
event.notification.close();
event.waitUntil(onNotificationClick(event));
});
async function showNotification(event) {
if (!event.data) {
throw new Error('Received push event without any data.');
}
const data = await event.data.json();
const notification = data.notification;
await self.registration.showNotification(notification.title, {
icon: '/icon-512.png',
lang: notification.lang,
dir: notification.dir,
body: notification.body,
silent: notification.silent,
tag: notification.topic,
data: {
navigate: notification.navigate,
}
});
}
async function onNotificationClick(event) {
const notification = event.notification;
const url = notification.data.navigate;
const windows = await clients.matchAll({type: 'window'});
for (const client of windows) {
if (client.url === url && 'focus' in client) {
return await client.focus();
}
}
if (clients.openWindow) {
return clients.openWindow(url);
}
}
| Product | Versions Compatible and additional computed target framework versions. |
|---|---|
| .NET | net10.0 is compatible. net10.0-android was computed. net10.0-browser was computed. net10.0-ios was computed. net10.0-maccatalyst was computed. net10.0-macos was computed. net10.0-tvos was computed. net10.0-windows was computed. |
Compatible target framework(s)
Included target framework(s) (in package)
Learn more about Target Frameworks and .NET Standard.
-
net10.0
- JetBrains.Annotations (>= 2025.1.0-eap1)
- Microsoft.Extensions.Logging.Abstractions (>= 10.0.0-preview.5.25277.114)
- Microsoft.Extensions.Options (>= 10.0.0-preview.5.25277.114)
NuGet packages
This package is not used by any NuGet packages.
GitHub repositories
This package is not used by any popular GitHub repositories.
| Version | Downloads | Last Updated |
|---|---|---|
| 0.1.0 | 64 | 3/31/2026 |