Notitie
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen u aan te melden of de directory te wijzigen.
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen de mappen te wijzigen.
Opmerking
Dit is niet de nieuwste versie van dit artikel. Zie de .NET 9-versie van dit artikel voor de huidige release.
Waarschuwing
Deze versie van ASP.NET Core wordt niet meer ondersteund. Zie het .NET- en .NET Core-ondersteuningsbeleid voor meer informatie. Zie de .NET 9-versie van dit artikel voor de huidige release.
Belangrijk
Deze informatie heeft betrekking op een pre-releaseproduct dat aanzienlijk kan worden gewijzigd voordat het commercieel wordt uitgebracht. Microsoft geeft geen garanties, uitdrukkelijk of impliciet, met betrekking tot de informatie die hier wordt verstrekt.
Zie de .NET 9-versie van dit artikel voor de huidige release.
Door Sébastien Sougnez
Deze zelfstudie laat zien hoe u Webpack gebruikt in een ASP.NET Core-web-app SignalR om een client te bundelen en te bouwen die is geschreven in TypeScript. Met Webpack kunnen ontwikkelaars de resources aan de clientzijde van een web-app bundelen en bouwen.
In deze handleiding leer je hoe je:
- Een ASP.NET Core-app SignalR maken
- De SignalR server configureren
- Een build-pijplijn configureren met behulp van Webpack
- De SignalR TypeScript-client configureren
- Communicatie tussen de client en de server inschakelen
Voorbeeldcode bekijken of downloaden (hoe download je)
Vereiste voorwaarden
Visual Studio 2022 met de workload voor ASP.NET en webontwikkeling.
De ASP.NET Core-web-app maken
Visual Studio gebruikt standaard de versie van npm die in de installatiemap is gevonden. Visual Studio configureren om te zoeken naar npm in de PATH
omgevingsvariabele:
Start Visual Studio. Selecteer Doorgaan zonder code in het startvenster.
Navigeer naar Hulpprogramma's>Opties>Projecten en Oplossingen>Webpakketbeheer>Externe Webhulpprogramma's.
Selecteer de
$(PATH)
vermelding in de lijst. Selecteer de pijl-omhoog om de vermelding naar de tweede positie in de lijst te verplaatsen en selecteer OK:.
Een nieuwe ASP.NET Core-web-app maken:
- Gebruik de menuoptie Bestand>Nieuw>Project en kies de ASP.NET Core Empty sjabloon. Kies Volgende.
- Geef het project
SignalRWebpack
een naam en selecteer Maken. - Selecteer .NET 8.0 (Langetermijnondersteuning) in de vervolgkeuzelijst Framework . Klik op Creëren.
Voeg het Microsoft.TypeScript.MSBuild NuGet-pakket toe aan het project:
- Klik in Solution Explorer met de rechtermuisknop op het projectknooppunt en selecteer NuGet-pakketten beheren. Zoek op het tabblad Bladeren naar
Microsoft.TypeScript.MSBuild
en selecteer Vervolgens Installeren aan de rechterkant om het pakket te installeren.
Visual Studio voegt het NuGet-pakket toe onder het knooppunt Afhankelijkheden in Solution Explorer, waardoor TypeScript-compilatie in het project wordt ingeschakeld.
De server configureren
In deze sectie configureert u de ASP.NET Core-web-app voor het verzenden en ontvangen van SignalR berichten.
In
Program.cs
, AddSignalR bellen:var builder = WebApplication.CreateBuilder(args); builder.Services.AddSignalR();
Nogmaals, in
Program.cs
, roep UseDefaultFiles en UseStaticFiles op:var app = builder.Build(); app.UseDefaultFiles(); app.UseStaticFiles();
Met de voorgaande code kan de server het
index.html
bestand zoeken en verwerken. Het bestand wordt geleverd, ongeacht of de gebruiker de volledige URL of de hoofd-URL van de web-app invoert.Maak een nieuwe map met de naam
Hubs
in de hoofdmapSignalRWebpack/
van het project, voor de SignalR hubklasse.Maak een nieuw bestand
Hubs/ChatHub.cs
met de volgende code:using Microsoft.AspNetCore.SignalR; namespace SignalRWebpack.Hubs; public class ChatHub : Hub { public async Task NewMessage(long username, string message) => await Clients.All.SendAsync("messageReceived", username, message); }
Met de voorgaande code worden ontvangen berichten verzonden naar alle verbonden gebruikers zodra de server ze ontvangt. Het is niet nodig om een algemene
on
methode te hebben om alle berichten te ontvangen. Een methode met de naam van het bericht is voldoende.In dit voorbeeld:
- De TypeScript-client verzendt een bericht dat is geïdentificeerd als
newMessage
. - De C#
NewMessage
-methode verwacht de gegevens die door de client worden verzonden. - Er wordt een aanroep gedaan op SendAsyncClients.All.
- De ontvangen berichten worden verzonden naar alle clients die zijn verbonden met de hub.
- De TypeScript-client verzendt een bericht dat is geïdentificeerd als
Voeg de volgende
using
instructie toe bovenaanProgram.cs
om deChatHub
verwijzing op te lossen:using SignalRWebpack.Hubs;
Koppel
Program.cs
de/hub
route aan deChatHub
hub. Vervang de code die wordt weergegevenHello World!
door de volgende code:app.MapHub<ChatHub>("/hub");
De client configureren
In deze sectie maakt u een Node.js project om TypeScript te converteren naar JavaScript en resources aan de clientzijde, inclusief HTML en CSS, te bundelen met behulp van Webpack.
Voer de volgende opdracht uit in de hoofdmap van het project om een
package.json
bestand te maken:npm init -y
Voeg de gemarkeerde eigenschap toe aan het
package.json
bestand en sla de bestandswijzigingen op:{ "name": "SignalRWebpack", "version": "1.0.0", "private": true, "description": "", "main": "index.js", "scripts": { "test": "echo \"Error: no test specified\" && exit 1" }, "keywords": [], "author": "", "license": "ISC" }
Het instellen van de
private
-eigenschap optrue
voorkomt pakketinstallatiewaarschuwingen in de volgende stap.Installeer de vereiste npm-pakketten. Voer de volgende opdracht uit vanuit de hoofdmap van het project:
npm i -D -E clean-webpack-plugin css-loader html-webpack-plugin mini-css-extract-plugin ts-loader typescript webpack webpack-cli
De
-E
optie schakelt het standaardgedrag van npm uit van het schrijven van semantische versiebeheerbereikoperators naarpackage.json
. Wordt bijvoorbeeld"webpack": "5.76.1"
gebruikt in plaats van"webpack": "^5.76.1"
. Met deze optie voorkomt u onbedoelde upgrades naar nieuwere pakketversies.Zie de npm-install-documentatie voor meer informatie.
Vervang de
scripts
eigenschap van hetpackage.json
bestand door de volgende code:"scripts": { "build": "webpack --mode=development --watch", "release": "webpack --mode=production", "publish": "npm run release && dotnet publish -c Release" },
De volgende scripts zijn gedefinieerd:
-
build
: bundelt de resources aan de clientzijde in de ontwikkelmodus en kijkt naar bestandswijzigingen. De file watcher zorgt ervoor dat de bundel telkens opnieuw wordt gegenereerd wanneer een projectbestand wordt gewijzigd. Demode
optie schakelt productieoptimalisaties uit, zoals boomschudden en minificatie. gebruikbuild
alleen voor ontwikkeling. -
release
: Bundelt de bronnen aan de klantzijde in de productiemodus. -
publish
: voert hetrelease
script uit om de resources aan de clientzijde te bundelen in de productiemodus. Hiermee wordt de opdracht publiceren van de .NET CLI aanroepen om de app te publiceren.
-
Maak een bestand met de naam
webpack.config.js
in de hoofdmap van het project, met de volgende code:const path = require("path"); const HtmlWebpackPlugin = require("html-webpack-plugin"); const { CleanWebpackPlugin } = require("clean-webpack-plugin"); const MiniCssExtractPlugin = require("mini-css-extract-plugin"); module.exports = { entry: "./src/index.ts", output: { path: path.resolve(__dirname, "wwwroot"), filename: "[name].[chunkhash].js", publicPath: "/", }, resolve: { extensions: [".js", ".ts"], }, module: { rules: [ { test: /\.ts$/, use: "ts-loader", }, { test: /\.css$/, use: [MiniCssExtractPlugin.loader, "css-loader"], }, ], }, plugins: [ new CleanWebpackPlugin(), new HtmlWebpackPlugin({ template: "./src/index.html", }), new MiniCssExtractPlugin({ filename: "css/[name].[chunkhash].css", }), ], };
Het voorgaande bestand configureert het compilatieproces webpack:
- De
output
eigenschap overschrijft de standaardwaarde vandist
. De bundel wordt in plaats daarvan geëmitteerd in dewwwroot
map. - De
resolve.extensions
array omvat.js
om de SignalR JavaScript-client te importeren.
- De
Maak een nieuwe map met de naam
src
in de hoofdmapSignalRWebpack/
van het project, voor de clientcode.Kopieer de
src
map en de inhoud van het voorbeeldproject naar de hoofdmap van het project. Desrc
map bevat de volgende bestanden:index.html
, waarmee de standaardmarkeringen van de startpagina worden gedefinieerd:<!DOCTYPE html> <html lang="en"> <head> <meta charset="utf-8" /> <title>ASP.NET Core SignalR with TypeScript and Webpack</title> </head> <body> <div id="divMessages" class="messages"></div> <div class="input-zone"> <label id="lblMessage" for="tbMessage">Message:</label> <input id="tbMessage" class="input-zone-input" type="text" /> <button id="btnSend">Send</button> </div> </body> </html>
css/main.css
, die CSS-stijlen biedt voor de startpagina:*, *::before, *::after { box-sizing: border-box; } html, body { margin: 0; padding: 0; } .input-zone { align-items: center; display: flex; flex-direction: row; margin: 10px; } .input-zone-input { flex: 1; margin-right: 10px; } .message-author { font-weight: bold; } .messages { border: 1px solid #000; margin: 10px; max-height: 300px; min-height: 300px; overflow-y: auto; padding: 5px; }
tsconfig.json
, waarmee de TypeScript-compiler wordt geconfigureerd voor het produceren van ECMAScript 5-compatibele JavaScript:{ "compilerOptions": { "target": "es5" } }
index.ts
:import * as signalR from "@microsoft/signalr"; import "./css/main.css"; const divMessages: HTMLDivElement = document.querySelector("#divMessages"); const tbMessage: HTMLInputElement = document.querySelector("#tbMessage"); const btnSend: HTMLButtonElement = document.querySelector("#btnSend"); const username = new Date().getTime(); const connection = new signalR.HubConnectionBuilder() .withUrl("/hub") .build(); connection.on("messageReceived", (username: string, message: string) => { const m = document.createElement("div"); m.innerHTML = `<div class="message-author">${username}</div><div>${message}</div>`; divMessages.appendChild(m); divMessages.scrollTop = divMessages.scrollHeight; }); connection.start().catch((err) => document.write(err)); tbMessage.addEventListener("keyup", (e: KeyboardEvent) => { if (e.key === "Enter") { send(); } }); btnSend.addEventListener("click", send); function send() { connection.send("newMessage", username, tbMessage.value) .then(() => (tbMessage.value = "")); }
Met de voorgaande code worden verwijzingen naar DOM-elementen opgehaald en worden twee gebeurtenis-handlers gekoppeld:
-
keyup
: wordt geactiveerd wanneer de gebruiker in hettbMessage
tekstvak typt en desend
functie aanroept wanneer de gebruiker op de Enter-toets drukt. -
click
: wordt geactiveerd wanneer de gebruiker de knop Verzenden selecteert en de functie Aanroepensend
wordt aangeroepen.
De
HubConnectionBuilder
klasse maakt een nieuwe opbouwfunctie voor het configureren van de serververbinding. DewithUrl
functie configureert de hub-URL.SignalR schakelt de uitwisseling van berichten tussen een client en een server in. Elk bericht heeft een specifieke naam. Berichten met de naam
messageReceived
kunnen bijvoorbeeld de logica uitvoeren die verantwoordelijk is voor het weergeven van het nieuwe bericht in de berichtenzone. Luisteren naar een specifiek bericht kan via deon
functie. Er kan naar een willekeurig aantal berichtnamen worden geluisterd. Het is ook mogelijk om parameters door te geven aan het bericht, zoals de naam van de auteur en de inhoud van het ontvangen bericht. Zodra de client een bericht ontvangt, wordt er een nieuwdiv
element gemaakt met de naam van de auteur en de inhoud van het bericht in hetinnerHTML
kenmerk. Het wordt toegevoegd aan het hoofdelementdiv
dat de berichten weergeeft.Voor het verzenden van een bericht via de WebSockets-verbinding moet je de
send
-methode aanroepen. De eerste parameter van de methode is de naam van het bericht. De berichtgegevens bevinden zich binnen de andere parameters. In dit voorbeeld wordt een bericht dat is geïdentificeerd alsnewMessage
verzonden naar de server. Het bericht bestaat uit de gebruikersnaam en de gebruikersinvoer uit een tekstvak. Als het verzenden werkt, wordt de waarde van het tekstvak gewist.-
Voer de volgende opdracht uit in de hoofdmap van het project:
npm i @microsoft/signalr @types/node
Met de voorgaande opdracht wordt het volgende geïnstalleerd:
- De SignalR TypeScript-client, waarmee de client berichten naar de server kan verzenden.
- De TypeScript-type-definities voor Node.js, waarmee compile-tijduitvoering van Node.js-typen mogelijk wordt gemaakt.
De app testen
Controleer of de app werkt met de volgende stappen:
Voer Webpack uit in
release
de modus. Voer de volgende opdracht uit in de hoofdmap van het project via het venster Package Manager Console.npm run release
Met deze opdracht worden de client-side assets gegenereerd die geleverd worden bij het uitvoeren van de app. De assets worden in de
wwwroot
map geplaatst.Webpack heeft de volgende taken voltooid:
- De inhoud van de
wwwroot
map is leeggemaakt. - Het TypeScript geconverteerd naar JavaScript in een proces dat transpilatie wordt genoemd.
- Het gegenereerde JavaScript beheren om de bestandsgrootte te verkleinen in een proces dat minificatie wordt genoemd.
- De verwerkte JavaScript-, CSS- en HTML-bestanden gekopieerd van
src
naar dewwwroot
map. - De volgende elementen zijn opgenomen in het
wwwroot/index.html
bestand:- Een
<link>
tag, die verwijst naar hetwwwroot/main.<hash>.css
bestand. Deze tag wordt direct vóór de afsluitende</head>
tag geplaatst. - Een
<script>
tag, die verwijst naar het minified-bestandwwwroot/main.<hash>.js
. Deze tag wordt direct na de afsluitende</title>
tag geplaatst.
- Een
- De inhoud van de
Selecteer Foutopsporing>starten zonder foutopsporing om de app in een browser te starten zonder het foutopsporingsprogramma te koppelen. Het
wwwroot/index.html
bestand wordt opgeslagen ophttps://localhost:<port>
.Als er compilatiefouten zijn, sluit u de oplossing en opent u deze opnieuw.
Open een andere browsersessie (om het even welke browser) en plak de URL in de adresbalk.
Kies een van beide browsers, typ iets in het tekstvak Bericht en selecteer de knop Verzenden . De unieke gebruikersnaam en het unieke bericht worden direct op beide pagina's weergegeven.
Volgende stappen
- Sterk getypeerde hubs
- Verificatie en autorisatie in ASP.NET Core SignalR
- MessagePack Hub Protocol in SignalR voor ASP.NET Core
Aanvullende bronnen
Deze zelfstudie laat zien hoe u Webpack gebruikt in een ASP.NET Core-web-app SignalR om een client te bundelen en te bouwen die is geschreven in TypeScript. Met Webpack kunnen ontwikkelaars de resources aan de clientzijde van een web-app bundelen en bouwen.
In deze handleiding leer je hoe je:
- Een ASP.NET Core-app SignalR maken
- De SignalR server configureren
- Een build-pijplijn configureren met behulp van Webpack
- De SignalR TypeScript-client configureren
- Communicatie tussen de client en de server inschakelen
Voorbeeldcode bekijken of downloaden (hoe download je)
Vereiste voorwaarden
Visual Studio 2022 met de workload voor ASP.NET en webontwikkeling.
De ASP.NET Core-web-app maken
Visual Studio gebruikt standaard de versie van npm die in de installatiemap is gevonden. Visual Studio configureren om te zoeken naar npm in de PATH
omgevingsvariabele:
Start Visual Studio. Selecteer Doorgaan zonder code in het startvenster.
Navigeer naar Hulpprogramma's>Opties>Projecten en Oplossingen>Webpakketbeheer>Externe Webhulpprogramma's.
Selecteer de
$(PATH)
vermelding in de lijst. Selecteer de pijl-omhoog om de vermelding naar de tweede positie in de lijst te verplaatsen en selecteer OK:.
Een nieuwe ASP.NET Core-web-app maken:
- Gebruik de menuoptie Bestand>Nieuw>Project en kies de ASP.NET Core Empty sjabloon. Kies Volgende.
- Geef het project
SignalRWebpack
een naam en selecteer Maken. - Selecteer .NET 7.0 (Standard Term Support) in de vervolgkeuzelijst Framework . Klik op Creëren.
Voeg het Microsoft.TypeScript.MSBuild NuGet-pakket toe aan het project:
- Klik in Solution Explorer met de rechtermuisknop op het projectknooppunt en selecteer NuGet-pakketten beheren. Zoek op het tabblad Bladeren naar
Microsoft.TypeScript.MSBuild
en selecteer Vervolgens Installeren aan de rechterkant om het pakket te installeren.
Visual Studio voegt het NuGet-pakket toe onder het knooppunt Afhankelijkheden in Solution Explorer, waardoor TypeScript-compilatie in het project wordt ingeschakeld.
De server configureren
In deze sectie configureert u de ASP.NET Core-web-app voor het verzenden en ontvangen van SignalR berichten.
In
Program.cs
, AddSignalR bellen:var builder = WebApplication.CreateBuilder(args); builder.Services.AddSignalR();
Nogmaals, in
Program.cs
, roep UseDefaultFiles en UseStaticFiles op:var app = builder.Build(); app.UseDefaultFiles(); app.UseStaticFiles();
Met de voorgaande code kan de server het
index.html
bestand zoeken en verwerken. Het bestand wordt geleverd, ongeacht of de gebruiker de volledige URL of de hoofd-URL van de web-app invoert.Maak een nieuwe map met de naam
Hubs
in de hoofdmapSignalRWebpack/
van het project, voor de SignalR hubklasse.Maak een nieuw bestand
Hubs/ChatHub.cs
met de volgende code:using Microsoft.AspNetCore.SignalR; namespace SignalRWebpack.Hubs; public class ChatHub : Hub { public async Task NewMessage(long username, string message) => await Clients.All.SendAsync("messageReceived", username, message); }
Met de voorgaande code worden ontvangen berichten verzonden naar alle verbonden gebruikers zodra de server ze ontvangt. Het is niet nodig om een algemene
on
methode te hebben om alle berichten te ontvangen. Een methode met de naam van het bericht is voldoende.In dit voorbeeld:
- De TypeScript-client verzendt een bericht dat is geïdentificeerd als
newMessage
. - De C#
NewMessage
-methode verwacht de gegevens die door de client worden verzonden. - Er wordt een aanroep gedaan op SendAsyncClients.All.
- De ontvangen berichten worden verzonden naar alle clients die zijn verbonden met de hub.
- De TypeScript-client verzendt een bericht dat is geïdentificeerd als
Voeg de volgende
using
instructie toe bovenaanProgram.cs
om deChatHub
verwijzing op te lossen:using SignalRWebpack.Hubs;
Koppel
Program.cs
de/hub
route aan deChatHub
hub. Vervang de code die wordt weergegevenHello World!
door de volgende code:app.MapHub<ChatHub>("/hub");
De client configureren
In deze sectie maakt u een Node.js project om TypeScript te converteren naar JavaScript en resources aan de clientzijde, inclusief HTML en CSS, te bundelen met behulp van Webpack.
Voer de volgende opdracht uit in de hoofdmap van het project om een
package.json
bestand te maken:npm init -y
Voeg de gemarkeerde eigenschap toe aan het
package.json
bestand en sla de bestandswijzigingen op:{ "name": "SignalRWebpack", "version": "1.0.0", "private": true, "description": "", "main": "index.js", "scripts": { "test": "echo \"Error: no test specified\" && exit 1" }, "keywords": [], "author": "", "license": "ISC" }
Het instellen van de
private
-eigenschap optrue
voorkomt pakketinstallatiewaarschuwingen in de volgende stap.Installeer de vereiste npm-pakketten. Voer de volgende opdracht uit vanuit de hoofdmap van het project:
npm i -D -E clean-webpack-plugin css-loader html-webpack-plugin mini-css-extract-plugin ts-loader typescript webpack webpack-cli
De
-E
optie schakelt het standaardgedrag van npm uit van het schrijven van semantische versiebeheerbereikoperators naarpackage.json
. Wordt bijvoorbeeld"webpack": "5.76.1"
gebruikt in plaats van"webpack": "^5.76.1"
. Met deze optie voorkomt u onbedoelde upgrades naar nieuwere pakketversies.Zie de npm-install-documentatie voor meer informatie.
Vervang de
scripts
eigenschap van hetpackage.json
bestand door de volgende code:"scripts": { "build": "webpack --mode=development --watch", "release": "webpack --mode=production", "publish": "npm run release && dotnet publish -c Release" },
De volgende scripts zijn gedefinieerd:
-
build
: bundelt de resources aan de clientzijde in de ontwikkelmodus en kijkt naar bestandswijzigingen. De file watcher zorgt ervoor dat de bundel telkens opnieuw wordt gegenereerd wanneer een projectbestand wordt gewijzigd. Demode
optie schakelt productieoptimalisaties uit, zoals boomschudden en minificatie. gebruikbuild
alleen voor ontwikkeling. -
release
: Bundelt de bronnen aan de klantzijde in de productiemodus. -
publish
: voert hetrelease
script uit om de resources aan de clientzijde te bundelen in de productiemodus. Hiermee wordt de opdracht publiceren van de .NET CLI aanroepen om de app te publiceren.
-
Maak een bestand met de naam
webpack.config.js
in de hoofdmap van het project, met de volgende code:const path = require("path"); const HtmlWebpackPlugin = require("html-webpack-plugin"); const { CleanWebpackPlugin } = require("clean-webpack-plugin"); const MiniCssExtractPlugin = require("mini-css-extract-plugin"); module.exports = { entry: "./src/index.ts", output: { path: path.resolve(__dirname, "wwwroot"), filename: "[name].[chunkhash].js", publicPath: "/", }, resolve: { extensions: [".js", ".ts"], }, module: { rules: [ { test: /\.ts$/, use: "ts-loader", }, { test: /\.css$/, use: [MiniCssExtractPlugin.loader, "css-loader"], }, ], }, plugins: [ new CleanWebpackPlugin(), new HtmlWebpackPlugin({ template: "./src/index.html", }), new MiniCssExtractPlugin({ filename: "css/[name].[chunkhash].css", }), ], };
Het voorgaande bestand configureert het compilatieproces webpack:
- De
output
eigenschap overschrijft de standaardwaarde vandist
. De bundel wordt in plaats daarvan geëmitteerd in dewwwroot
map. - De
resolve.extensions
array omvat.js
om de SignalR JavaScript-client te importeren.
- De
Kopieer de
src
map en de inhoud van het voorbeeldproject naar de hoofdmap van het project. Desrc
map bevat de volgende bestanden:index.html
, waarmee de standaardmarkeringen van de startpagina worden gedefinieerd:<!DOCTYPE html> <html lang="en"> <head> <meta charset="utf-8" /> <title>ASP.NET Core SignalR with TypeScript and Webpack</title> </head> <body> <div id="divMessages" class="messages"></div> <div class="input-zone"> <label id="lblMessage" for="tbMessage">Message:</label> <input id="tbMessage" class="input-zone-input" type="text" /> <button id="btnSend">Send</button> </div> </body> </html>
css/main.css
, die CSS-stijlen biedt voor de startpagina:*, *::before, *::after { box-sizing: border-box; } html, body { margin: 0; padding: 0; } .input-zone { align-items: center; display: flex; flex-direction: row; margin: 10px; } .input-zone-input { flex: 1; margin-right: 10px; } .message-author { font-weight: bold; } .messages { border: 1px solid #000; margin: 10px; max-height: 300px; min-height: 300px; overflow-y: auto; padding: 5px; }
tsconfig.json
, waarmee de TypeScript-compiler wordt geconfigureerd voor het produceren van ECMAScript 5-compatibele JavaScript:{ "compilerOptions": { "target": "es5" } }
index.ts
:import * as signalR from "@microsoft/signalr"; import "./css/main.css"; const divMessages: HTMLDivElement = document.querySelector("#divMessages"); const tbMessage: HTMLInputElement = document.querySelector("#tbMessage"); const btnSend: HTMLButtonElement = document.querySelector("#btnSend"); const username = new Date().getTime(); const connection = new signalR.HubConnectionBuilder() .withUrl("/hub") .build(); connection.on("messageReceived", (username: string, message: string) => { const m = document.createElement("div"); m.innerHTML = `<div class="message-author">${username}</div><div>${message}</div>`; divMessages.appendChild(m); divMessages.scrollTop = divMessages.scrollHeight; }); connection.start().catch((err) => document.write(err)); tbMessage.addEventListener("keyup", (e: KeyboardEvent) => { if (e.key === "Enter") { send(); } }); btnSend.addEventListener("click", send); function send() { connection.send("newMessage", username, tbMessage.value) .then(() => (tbMessage.value = "")); }
Met de voorgaande code worden verwijzingen naar DOM-elementen opgehaald en worden twee gebeurtenis-handlers gekoppeld:
-
keyup
: wordt geactiveerd wanneer de gebruiker in hettbMessage
tekstvak typt en desend
functie aanroept wanneer de gebruiker op de Enter-toets drukt. -
click
: wordt geactiveerd wanneer de gebruiker de knop Verzenden selecteert en de functie Aanroepensend
wordt aangeroepen.
De
HubConnectionBuilder
klasse maakt een nieuwe opbouwfunctie voor het configureren van de serververbinding. DewithUrl
functie configureert de hub-URL.SignalR schakelt de uitwisseling van berichten tussen een client en een server in. Elk bericht heeft een specifieke naam. Berichten met de naam
messageReceived
kunnen bijvoorbeeld de logica uitvoeren die verantwoordelijk is voor het weergeven van het nieuwe bericht in de berichtenzone. Luisteren naar een specifiek bericht kan via deon
functie. Er kan naar een willekeurig aantal berichtnamen worden geluisterd. Het is ook mogelijk om parameters door te geven aan het bericht, zoals de naam van de auteur en de inhoud van het ontvangen bericht. Zodra de client een bericht ontvangt, wordt er een nieuwdiv
element gemaakt met de naam van de auteur en de inhoud van het bericht in hetinnerHTML
kenmerk. Het wordt toegevoegd aan het hoofdelementdiv
dat de berichten weergeeft.Voor het verzenden van een bericht via de WebSockets-verbinding moet je de
send
-methode aanroepen. De eerste parameter van de methode is de naam van het bericht. De berichtgegevens bevinden zich binnen de andere parameters. In dit voorbeeld wordt een bericht dat is geïdentificeerd alsnewMessage
verzonden naar de server. Het bericht bestaat uit de gebruikersnaam en de gebruikersinvoer uit een tekstvak. Als het verzenden werkt, wordt de waarde van het tekstvak gewist.-
Voer de volgende opdracht uit in de hoofdmap van het project:
npm i @microsoft/signalr @types/node
Met de voorgaande opdracht wordt het volgende geïnstalleerd:
- De SignalR TypeScript-client, waarmee de client berichten naar de server kan verzenden.
- De TypeScript-type-definities voor Node.js, waarmee compile-tijduitvoering van Node.js-typen mogelijk wordt gemaakt.
De app testen
Controleer of de app werkt met de volgende stappen:
Voer Webpack uit in
release
de modus. Voer de volgende opdracht uit in de hoofdmap van het project via het venster Package Manager Console.npm run release
Met deze opdracht worden de client-side assets gegenereerd die geleverd worden bij het uitvoeren van de app. De assets worden in de
wwwroot
map geplaatst.Webpack heeft de volgende taken voltooid:
- De inhoud van de
wwwroot
map is leeggemaakt. - Het TypeScript geconverteerd naar JavaScript in een proces dat transpilatie wordt genoemd.
- Het gegenereerde JavaScript beheren om de bestandsgrootte te verkleinen in een proces dat minificatie wordt genoemd.
- De verwerkte JavaScript-, CSS- en HTML-bestanden gekopieerd van
src
naar dewwwroot
map. - De volgende elementen zijn opgenomen in het
wwwroot/index.html
bestand:- Een
<link>
tag, die verwijst naar hetwwwroot/main.<hash>.css
bestand. Deze tag wordt direct vóór de afsluitende</head>
tag geplaatst. - Een
<script>
tag, die verwijst naar het minified-bestandwwwroot/main.<hash>.js
. Deze tag wordt direct na de afsluitende</title>
tag geplaatst.
- Een
- De inhoud van de
Selecteer Foutopsporing>starten zonder foutopsporing om de app in een browser te starten zonder het foutopsporingsprogramma te koppelen. Het
wwwroot/index.html
bestand wordt opgeslagen ophttps://localhost:<port>
.Als er compilatiefouten zijn, sluit u de oplossing en opent u deze opnieuw.
Open een andere browsersessie (om het even welke browser) en plak de URL in de adresbalk.
Kies een van beide browsers, typ iets in het tekstvak Bericht en selecteer de knop Verzenden . De unieke gebruikersnaam en het unieke bericht worden direct op beide pagina's weergegeven.
Volgende stappen
- Sterk getypeerde hubs
- Verificatie en autorisatie in ASP.NET Core SignalR
- MessagePack Hub Protocol in SignalR voor ASP.NET Core
Aanvullende bronnen
Deze zelfstudie laat zien hoe u Webpack gebruikt in een ASP.NET Core-web-app SignalR om een client te bundelen en te bouwen die is geschreven in TypeScript. Met Webpack kunnen ontwikkelaars de resources aan de clientzijde van een web-app bundelen en bouwen.
In deze handleiding leer je hoe je:
- Een ASP.NET Core-app SignalR maken
- De SignalR server configureren
- Een build-pijplijn configureren met behulp van Webpack
- De SignalR TypeScript-client configureren
- Communicatie tussen de client en de server inschakelen
Voorbeeldcode bekijken of downloaden (hoe download je)
Vereiste voorwaarden
- Visual Studio 2022 met de workload voor ASP.NET en webontwikkeling.
- .NET 6 SDK
De ASP.NET Core-web-app maken
Visual Studio gebruikt standaard de versie van npm die in de installatiemap is gevonden. Visual Studio configureren om te zoeken naar npm in de PATH
omgevingsvariabele:
Start Visual Studio. Selecteer Doorgaan zonder code in het startvenster.
Navigeer naar Hulpprogramma's>Opties>Projecten en Oplossingen>Webpakketbeheer>Externe Webhulpprogramma's.
Selecteer de
$(PATH)
vermelding in de lijst. Selecteer de pijl-omhoog om de vermelding naar de tweede positie in de lijst te verplaatsen en selecteer OK:.
Een nieuwe ASP.NET Core-web-app maken:
- Gebruik de menuoptie Bestand>Nieuw>Project en kies de ASP.NET Core Empty sjabloon. Kies Volgende.
- Geef het project
SignalRWebpack
een naam en selecteer Maken. - Selecteer .NET 6.0 (Langetermijnondersteuning) in de vervolgkeuzelijst Framework . Klik op Creëren.
Voeg het Microsoft.TypeScript.MSBuild NuGet-pakket toe aan het project:
- Klik in Solution Explorer met de rechtermuisknop op het projectknooppunt en selecteer NuGet-pakketten beheren. Zoek op het tabblad Bladeren naar
Microsoft.TypeScript.MSBuild
en selecteer Vervolgens Installeren aan de rechterkant om het pakket te installeren.
Visual Studio voegt het NuGet-pakket toe onder het knooppunt Afhankelijkheden in Solution Explorer, waardoor TypeScript-compilatie in het project wordt ingeschakeld.
De server configureren
In deze sectie configureert u de ASP.NET Core-web-app voor het verzenden en ontvangen van SignalR berichten.
In
Program.cs
, AddSignalR bellen:var builder = WebApplication.CreateBuilder(args); builder.Services.AddSignalR();
Nogmaals, in
Program.cs
, roep UseDefaultFiles en UseStaticFiles op:var app = builder.Build(); app.UseDefaultFiles(); app.UseStaticFiles();
Met de voorgaande code kan de server het
index.html
bestand zoeken en verwerken. Het bestand wordt geleverd, ongeacht of de gebruiker de volledige URL of de hoofd-URL van de web-app invoert.Maak een nieuwe map met de naam
Hubs
in de hoofdmapSignalRWebpack/
van het project, voor de SignalR hubklasse.Maak een nieuw bestand
Hubs/ChatHub.cs
met de volgende code:using Microsoft.AspNetCore.SignalR; namespace SignalRWebpack.Hubs; public class ChatHub : Hub { public async Task NewMessage(long username, string message) => await Clients.All.SendAsync("messageReceived", username, message); }
Met de voorgaande code worden ontvangen berichten verzonden naar alle verbonden gebruikers zodra de server ze ontvangt. Het is niet nodig om een algemene
on
methode te hebben om alle berichten te ontvangen. Een methode met de naam van het bericht is voldoende.In dit voorbeeld verzendt de TypeScript-client een bericht dat is geïdentificeerd als
newMessage
. De C#NewMessage
-methode verwacht de gegevens die door de client worden verzonden. Er wordt een aanroep gedaan op SendAsyncClients.All. De ontvangen berichten worden verzonden naar alle clients die zijn verbonden met de hub.Voeg de volgende
using
instructie toe bovenaanProgram.cs
om deChatHub
verwijzing op te lossen:using SignalRWebpack.Hubs;
Koppel
Program.cs
de/hub
route aan deChatHub
hub. Vervang de code die wordt weergegevenHello World!
door de volgende code:app.MapHub<ChatHub>("/hub");
De client configureren
In deze sectie maakt u een Node.js project om TypeScript te converteren naar JavaScript en resources aan de clientzijde, inclusief HTML en CSS, te bundelen met behulp van Webpack.
Voer de volgende opdracht uit in de hoofdmap van het project om een
package.json
bestand te maken:npm init -y
Voeg de gemarkeerde eigenschap toe aan het
package.json
bestand en sla de bestandswijzigingen op:{ "name": "SignalRWebpack", "version": "1.0.0", "private": true, "description": "", "main": "index.js", "scripts": { "test": "echo \"Error: no test specified\" && exit 1" }, "keywords": [], "author": "", "license": "ISC" }
Het instellen van de
private
-eigenschap optrue
voorkomt pakketinstallatiewaarschuwingen in de volgende stap.Installeer de vereiste npm-pakketten. Voer de volgende opdracht uit vanuit de hoofdmap van het project:
npm i -D -E clean-webpack-plugin css-loader html-webpack-plugin mini-css-extract-plugin ts-loader typescript webpack webpack-cli
De
-E
optie schakelt het standaardgedrag van npm uit van het schrijven van semantische versiebeheerbereikoperators naarpackage.json
. Wordt bijvoorbeeld"webpack": "5.70.0"
gebruikt in plaats van"webpack": "^5.70.0"
. Met deze optie voorkomt u onbedoelde upgrades naar nieuwere pakketversies.Zie de npm-install-documentatie voor meer informatie.
Vervang de
scripts
eigenschap van hetpackage.json
bestand door de volgende code:"scripts": { "build": "webpack --mode=development --watch", "release": "webpack --mode=production", "publish": "npm run release && dotnet publish -c Release" },
De volgende scripts zijn gedefinieerd:
-
build
: bundelt de resources aan de clientzijde in de ontwikkelmodus en kijkt naar bestandswijzigingen. De file watcher zorgt ervoor dat de bundel telkens opnieuw wordt gegenereerd wanneer een projectbestand wordt gewijzigd. Demode
optie schakelt productieoptimalisaties uit, zoals boomschudden en minificatie. gebruikbuild
alleen voor ontwikkeling. -
release
: Bundelt de bronnen aan de klantzijde in de productiemodus. -
publish
: voert hetrelease
script uit om de resources aan de clientzijde te bundelen in de productiemodus. Hiermee wordt de opdracht publiceren van de .NET CLI aanroepen om de app te publiceren.
-
Maak een bestand met de naam
webpack.config.js
in de hoofdmap van het project, met de volgende code:const path = require("path"); const HtmlWebpackPlugin = require("html-webpack-plugin"); const { CleanWebpackPlugin } = require("clean-webpack-plugin"); const MiniCssExtractPlugin = require("mini-css-extract-plugin"); module.exports = { entry: "./src/index.ts", output: { path: path.resolve(__dirname, "wwwroot"), filename: "[name].[chunkhash].js", publicPath: "/", }, resolve: { extensions: [".js", ".ts"], }, module: { rules: [ { test: /\.ts$/, use: "ts-loader", }, { test: /\.css$/, use: [MiniCssExtractPlugin.loader, "css-loader"], }, ], }, plugins: [ new CleanWebpackPlugin(), new HtmlWebpackPlugin({ template: "./src/index.html", }), new MiniCssExtractPlugin({ filename: "css/[name].[chunkhash].css", }), ], };
Het voorgaande bestand configureert het compilatieproces webpack:
- De
output
eigenschap overschrijft de standaardwaarde vandist
. De bundel wordt in plaats daarvan geëmitteerd in dewwwroot
map. - De
resolve.extensions
array omvat.js
om de SignalR JavaScript-client te importeren.
- De
Kopieer de
src
map en de inhoud van het voorbeeldproject naar de hoofdmap van het project. Desrc
map bevat de volgende bestanden:index.html
, waarmee de standaardmarkeringen van de startpagina worden gedefinieerd:<!DOCTYPE html> <html lang="en"> <head> <meta charset="utf-8" /> <title>ASP.NET Core SignalR with TypeScript and Webpack</title> </head> <body> <div id="divMessages" class="messages"></div> <div class="input-zone"> <label id="lblMessage" for="tbMessage">Message:</label> <input id="tbMessage" class="input-zone-input" type="text" /> <button id="btnSend">Send</button> </div> </body> </html>
css/main.css
, die CSS-stijlen biedt voor de startpagina:*, *::before, *::after { box-sizing: border-box; } html, body { margin: 0; padding: 0; } .input-zone { align-items: center; display: flex; flex-direction: row; margin: 10px; } .input-zone-input { flex: 1; margin-right: 10px; } .message-author { font-weight: bold; } .messages { border: 1px solid #000; margin: 10px; max-height: 300px; min-height: 300px; overflow-y: auto; padding: 5px; }
tsconfig.json
, waarmee de TypeScript-compiler wordt geconfigureerd voor het produceren van ECMAScript 5-compatibele JavaScript:{ "compilerOptions": { "target": "es5" } }
index.ts
:import * as signalR from "@microsoft/signalr"; import "./css/main.css"; const divMessages: HTMLDivElement = document.querySelector("#divMessages"); const tbMessage: HTMLInputElement = document.querySelector("#tbMessage"); const btnSend: HTMLButtonElement = document.querySelector("#btnSend"); const username = new Date().getTime(); const connection = new signalR.HubConnectionBuilder() .withUrl("/hub") .build(); connection.on("messageReceived", (username: string, message: string) => { const m = document.createElement("div"); m.innerHTML = `<div class="message-author">${username}</div><div>${message}</div>`; divMessages.appendChild(m); divMessages.scrollTop = divMessages.scrollHeight; }); connection.start().catch((err) => document.write(err)); tbMessage.addEventListener("keyup", (e: KeyboardEvent) => { if (e.key === "Enter") { send(); } }); btnSend.addEventListener("click", send); function send() { connection.send("newMessage", username, tbMessage.value) .then(() => (tbMessage.value = "")); }
Met de voorgaande code worden verwijzingen naar DOM-elementen opgehaald en worden twee gebeurtenis-handlers gekoppeld:
-
keyup
: wordt geactiveerd wanneer de gebruiker in hettbMessage
tekstvak typt en desend
functie aanroept wanneer de gebruiker op de Enter-toets drukt. -
click
: wordt geactiveerd wanneer de gebruiker de knop Verzenden selecteert en de functie Aanroepensend
wordt aangeroepen.
De
HubConnectionBuilder
klasse maakt een nieuwe opbouwfunctie voor het configureren van de serververbinding. DewithUrl
functie configureert de hub-URL.SignalR schakelt de uitwisseling van berichten tussen een client en een server in. Elk bericht heeft een specifieke naam. Berichten met de naam
messageReceived
kunnen bijvoorbeeld de logica uitvoeren die verantwoordelijk is voor het weergeven van het nieuwe bericht in de berichtenzone. Luisteren naar een specifiek bericht kan via deon
functie. Er kan naar een willekeurig aantal berichtnamen worden geluisterd. Het is ook mogelijk om parameters door te geven aan het bericht, zoals de naam van de auteur en de inhoud van het ontvangen bericht. Zodra de client een bericht ontvangt, wordt er een nieuwdiv
element gemaakt met de naam van de auteur en de inhoud van het bericht in hetinnerHTML
kenmerk. Het wordt toegevoegd aan het hoofdelementdiv
dat de berichten weergeeft.Voor het verzenden van een bericht via de WebSockets-verbinding moet je de
send
-methode aanroepen. De eerste parameter van de methode is de naam van het bericht. De berichtgegevens bevinden zich binnen de andere parameters. In dit voorbeeld wordt een bericht dat is geïdentificeerd alsnewMessage
verzonden naar de server. Het bericht bestaat uit de gebruikersnaam en de gebruikersinvoer uit een tekstvak. Als het verzenden werkt, wordt de waarde van het tekstvak gewist.Voer de volgende opdracht uit in de hoofdmap van het project:
npm i @microsoft/signalr @types/node
Met de voorgaande opdracht wordt het volgende geïnstalleerd:
- De SignalR TypeScript-client, waarmee de client berichten naar de server kan verzenden.
- De TypeScript-type-definities voor Node.js, waarmee compile-tijduitvoering van Node.js-typen mogelijk wordt gemaakt.
De app testen
Controleer of de app werkt met de volgende stappen:
Voer Webpack uit in
release
de modus. Voer de volgende opdracht uit in de hoofdmap van het project via het venster Package Manager Console. Als u zich niet in de hoofdmap van het project bevindt, voer dan eerstcd SignalRWebpack
in voordat u de opdracht invoert.npm run release
Met deze opdracht worden de client-side assets gegenereerd die geleverd worden bij het uitvoeren van de app. De assets worden in de
wwwroot
map geplaatst.Webpack heeft de volgende taken voltooid:
- De inhoud van de
wwwroot
map is leeggemaakt. - Het TypeScript geconverteerd naar JavaScript in een proces dat transpilatie wordt genoemd.
- Het gegenereerde JavaScript beheren om de bestandsgrootte te verkleinen in een proces dat minificatie wordt genoemd.
- De verwerkte JavaScript-, CSS- en HTML-bestanden gekopieerd van
src
naar dewwwroot
map. - De volgende elementen zijn opgenomen in het
wwwroot/index.html
bestand:- Een
<link>
tag, die verwijst naar hetwwwroot/main.<hash>.css
bestand. Deze tag wordt direct vóór de afsluitende</head>
tag geplaatst. - Een
<script>
tag, die verwijst naar het minified-bestandwwwroot/main.<hash>.js
. Deze tag wordt direct na de afsluitende</title>
tag geplaatst.
- Een
- De inhoud van de
Selecteer Foutopsporing>starten zonder foutopsporing om de app in een browser te starten zonder het foutopsporingsprogramma te koppelen. Het
wwwroot/index.html
bestand wordt opgeslagen ophttps://localhost:<port>
.Als er compilatiefouten optreden, sluit u de oplossing en opent u deze opnieuw.
Open een andere browsersessie (om het even welke browser) en plak de URL in de adresbalk.
Kies een van beide browsers, typ iets in het tekstvak Bericht en selecteer de knop Verzenden . De unieke gebruikersnaam en het unieke bericht worden direct op beide pagina's weergegeven.
Volgende stappen
- Sterk getypeerde hubs
- Verificatie en autorisatie in ASP.NET Core SignalR
- MessagePack Hub Protocol in SignalR voor ASP.NET Core
Aanvullende bronnen
Deze zelfstudie laat zien hoe u Webpack gebruikt in een ASP.NET Core-web-app SignalR om een client te bundelen en te bouwen die is geschreven in TypeScript. Met Webpack kunnen ontwikkelaars de resources aan de clientzijde van een web-app bundelen en bouwen.
In deze handleiding leer je hoe je:
- Een startstructuur voor een ASP.NET Core-app SignalR maken
- De SignalR TypeScript-client configureren
- Een build-pijplijn configureren met behulp van Webpack
- De SignalR server configureren
- Communicatie tussen client en server inschakelen
Voorbeeldcode bekijken of downloaden (hoe download je)
Vereiste voorwaarden
- Visual Studio 2019 met de workload voor ASP.NET en webontwikkeling
- .NET Core SDK 3.0 of hoger
- Node.js met npm
De ASP.NET Core-web-app maken
Configureer Visual Studio om te zoeken naar npm in de omgevingsvariabele PATH . Visual Studio gebruikt standaard de versie van npm die in de installatiemap is gevonden. Volg deze instructies in Visual Studio:
Start Visual Studio. Selecteer Doorgaan zonder code in het startvenster.
Navigeer naar Hulpprogramma's>Opties>Projecten en Oplossingen>Webpakketbeheer>Externe Webhulpprogramma's.
Selecteer de vermelding $(PATH) in de lijst. Selecteer de pijl-omhoog om de vermelding naar de tweede positie in de lijst te verplaatsen en selecteer OK.
.
Visual Studio-configuratie is voltooid.
- Gebruik de menuoptieNieuw>project> en kies de sjabloon ASP.NET Core Web Application. Kies Volgende.
- Geef het project de naam *SignalRWebPac' en selecteer Maken.
- Selecteer .NET Core in de vervolgkeuzelijst van het doelframework en selecteer ASP.NET Core 3.1 in de vervolgkeuzelijst frameworkselector. Selecteer de sjabloon Leeg en selecteer Maken.
Voeg het Microsoft.TypeScript.MSBuild
pakket toe aan het project:
- Klik in Solution Explorer (rechterdeelvenster) met de rechtermuisknop op het projectknooppunt en selecteer NuGet-pakketten beheren. Zoek op het tabblad Bladeren naar
Microsoft.TypeScript.MSBuild
en klik vervolgens op Installeren aan de rechterkant om het pakket te installeren.
Visual Studio voegt het NuGet-pakket toe onder het knooppunt Afhankelijkheden in Solution Explorer, waardoor TypeScript-compilatie in het project wordt ingeschakeld.
Webpack en TypeScript configureren
Met de volgende stappen configureert u de conversie van TypeScript naar JavaScript en de bundeling van resources aan de clientzijde.
Voer de volgende opdracht uit in de hoofdmap van het project om een
package.json
bestand te maken:npm init -y
Voeg de gemarkeerde eigenschap toe aan het
package.json
bestand en sla de bestandswijzigingen op:{ "name": "SignalRWebPack", "version": "1.0.0", "private": true, "description": "", "main": "index.js", "scripts": { "test": "echo \"Error: no test specified\" && exit 1" }, "keywords": [], "author": "", "license": "ISC" }
Het instellen van de
private
-eigenschap optrue
voorkomt pakketinstallatiewaarschuwingen in de volgende stap.Installeer de vereiste npm-pakketten. Voer de volgende opdracht uit vanuit de hoofdmap van het project:
npm i -D -E clean-webpack-plugin@3.0.0 css-loader@3.4.2 html-webpack-plugin@3.2.0 mini-css-extract-plugin@0.9.0 ts-loader@6.2.1 typescript@3.7.5 webpack@4.41.5 webpack-cli@3.3.10
Enkele opdrachtdetails die u moet noteren:
- Een versienummer volgt het
@
teken voor elke pakketnaam. npm installeert deze specifieke pakketversies. - Met de
-E
optie wordt het standaardgedrag van npm uitgeschakeld voor het schrijven van semantische versiebeheerbereikoperators naar *packagejson
. Wordt bijvoorbeeld"webpack": "4.41.5"
gebruikt in plaats van"webpack": "^4.41.5"
. Met deze optie voorkomt u onbedoelde upgrades naar nieuwere pakketversies.
Zie de npm-install docs voor meer informatie.
- Een versienummer volgt het
Vervang de
scripts
eigenschap van hetpackage.json
bestand door de volgende code:"scripts": { "build": "webpack --mode=development --watch", "release": "webpack --mode=production", "publish": "npm run release && dotnet publish -c Release" },
Enkele uitleg van de scripts:
-
build
: bundelt de resources aan de clientzijde in de ontwikkelmodus en kijkt naar bestandswijzigingen. De file watcher zorgt ervoor dat de bundel telkens opnieuw wordt gegenereerd wanneer een projectbestand wordt gewijzigd. Demode
optie schakelt productieoptimalisaties uit, zoals boomschudden en minificatie. Gebruikbuild
alleen tijdens ontwikkeling. -
release
: Bundelt de bronnen aan de klantzijde in de productiemodus. -
publish
: voert hetrelease
script uit om de resources aan de clientzijde te bundelen in de productiemodus. Hiermee wordt de opdracht publiceren van de .NET CLI aanroepen om de app te publiceren.
-
Maak een bestand met de naam
webpack.config.js
, in de hoofdmap van het project, met de volgende code:const path = require("path"); const HtmlWebpackPlugin = require("html-webpack-plugin"); const { CleanWebpackPlugin } = require("clean-webpack-plugin"); const MiniCssExtractPlugin = require("mini-css-extract-plugin"); module.exports = { entry: "./src/index.ts", output: { path: path.resolve(__dirname, "wwwroot"), filename: "[name].[chunkhash].js", publicPath: "/" }, resolve: { extensions: [".js", ".ts"] }, module: { rules: [ { test: /\.ts$/, use: "ts-loader" }, { test: /\.css$/, use: [MiniCssExtractPlugin.loader, "css-loader"] } ] }, plugins: [ new CleanWebpackPlugin(), new HtmlWebpackPlugin({ template: "./src/index.html" }), new MiniCssExtractPlugin({ filename: "css/[name].[chunkhash].css" }) ] };
Met het voorgaande bestand wordt de webpackcompilatie geconfigureerd. Enkele configuratiedetails die u moet noteren:
- De
output
eigenschap overschrijft de standaardwaarde vandist
. De bundel wordt in plaats daarvan geëmitteerd in dewwwroot
map. - De
resolve.extensions
array omvat.js
om de SignalR JavaScript-client te importeren.
- De
Maak een nieuwe src-map in de hoofdmap van het project om de client-side assets van het project op te slaan.
Maak
src/index.html
met de volgende markeringen.<!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <title>ASP.NET Core SignalR</title> </head> <body> <div id="divMessages" class="messages"> </div> <div class="input-zone"> <label id="lblMessage" for="tbMessage">Message:</label> <input id="tbMessage" class="input-zone-input" type="text" /> <button id="btnSend">Send</button> </div> </body> </html>
De voorgaande HTML definieert de standaardmarkeringen van de startpagina.
Maak een nieuwe src/css-directory. Het doel is om de
.css
bestanden van het project op te slaan.Maak
src/css/main.css
met de volgende CSS:*, *::before, *::after { box-sizing: border-box; } html, body { margin: 0; padding: 0; } .input-zone { align-items: center; display: flex; flex-direction: row; margin: 10px; } .input-zone-input { flex: 1; margin-right: 10px; } .message-author { font-weight: bold; } .messages { border: 1px solid #000; margin: 10px; max-height: 300px; min-height: 300px; overflow-y: auto; padding: 5px; }
Het voorgaande
main.css
bestand styleert de app.Maak
src/tsconfig.json
met de volgende JSON:{ "compilerOptions": { "target": "es5" } }
Met de voorgaande code wordt de TypeScript-compiler geconfigureerd om ECMAScript 5-compatibele JavaScript te produceren.
Maak
src/index.ts
met de volgende code:import "./css/main.css"; const divMessages: HTMLDivElement = document.querySelector("#divMessages"); const tbMessage: HTMLInputElement = document.querySelector("#tbMessage"); const btnSend: HTMLButtonElement = document.querySelector("#btnSend"); const username = new Date().getTime(); tbMessage.addEventListener("keyup", (e: KeyboardEvent) => { if (e.key === "Enter") { send(); } }); btnSend.addEventListener("click", send); function send() { }
Met het hierboven genoemde TypeScript worden verwijzingen naar DOM-elementen verkregen en worden er twee eventhandlers gekoppeld:
-
keyup
: Deze gebeurtenis wordt geactiveerd wanneer de gebruiker in hettbMessage
tekstvak typt. Desend
functie wordt aangeroepen wanneer de gebruiker op de Enter-toets drukt. -
click
: Deze gebeurtenis wordt geactiveerd wanneer de gebruiker de knop Verzenden selecteert. Desend
functie wordt aangeroepen.
-
De app configureren
Voeg in
Startup.Configure
aanroepen toe aan UseDefaultFiles(IApplicationBuilder) en UseStaticFiles(IApplicationBuilder).public void Configure(IApplicationBuilder app, IWebHostEnvironment env) { if (env.IsDevelopment()) { app.UseDeveloperExceptionPage(); } app.UseRouting(); app.UseDefaultFiles(); app.UseStaticFiles(); app.UseEndpoints(endpoints => { endpoints.MapHub<ChatHub>("/hub"); }); }
Met de voorgaande code kan de server het
index.html
bestand zoeken en verwerken. Het bestand wordt geleverd, ongeacht of de gebruiker de volledige URL of de hoofd-URL van de web-app invoert.Wijs aan het einde van
Startup.Configure
een /hub-route toe aan deChatHub
hub. Vervang de code die Hello World! weergeeft door de volgende regel:app.UseEndpoints(endpoints => { endpoints.MapHub<ChatHub>("/hub"); });
In
Startup.ConfigureServices
, bel AddSignalR.services.AddSignalR();
Maak een nieuwe map met de naam Hubs in de projecthoofdmap SignalRWebPack/ om de SignalR hub op te slaan.
Maak een hub
Hubs/ChatHub.cs
met de volgende code:using Microsoft.AspNetCore.SignalR; using System.Threading.Tasks; namespace SignalRWebPack.Hubs { public class ChatHub : Hub { } }
Voeg de volgende
using
instructie toe boven aan hetStartup.cs
bestand om deChatHub
verwijzing op te lossen:using SignalRWebPack.Hubs;
Client- en servercommunicatie inschakelen
De app geeft momenteel een basisformulier weer om berichten te verzenden, maar is nog niet functioneel. De server luistert naar een specifieke route, maar doet niets met verzonden berichten.
Voer de volgende opdracht uit in de hoofdmap van het project:
npm i @microsoft/signalr @types/node
Met de voorgaande opdracht wordt het volgende geïnstalleerd:
- De SignalR TypeScript-client, waarmee de client berichten naar de server kan verzenden.
- De TypeScript-type-definities voor Node.js, waarmee compile-tijduitvoering van Node.js-typen mogelijk wordt gemaakt.
Voeg de gemarkeerde code toe aan het
src/index.ts
bestand:import "./css/main.css"; import * as signalR from "@microsoft/signalr"; const divMessages: HTMLDivElement = document.querySelector("#divMessages"); const tbMessage: HTMLInputElement = document.querySelector("#tbMessage"); const btnSend: HTMLButtonElement = document.querySelector("#btnSend"); const username = new Date().getTime(); const connection = new signalR.HubConnectionBuilder() .withUrl("/hub") .build(); connection.on("messageReceived", (username: string, message: string) => { let m = document.createElement("div"); m.innerHTML = `<div class="message-author">${username}</div><div>${message}</div>`; divMessages.appendChild(m); divMessages.scrollTop = divMessages.scrollHeight; }); connection.start().catch(err => document.write(err)); tbMessage.addEventListener("keyup", (e: KeyboardEvent) => { if (e.key === "Enter") { send(); } }); btnSend.addEventListener("click", send); function send() { }
De voorgaande code ondersteunt het ontvangen van berichten van de server. De
HubConnectionBuilder
klasse maakt een nieuwe opbouwfunctie voor het configureren van de serververbinding. DewithUrl
functie configureert de hub-URL.SignalR schakelt de uitwisseling van berichten tussen een client en een server in. Elk bericht heeft een specifieke naam. Berichten met de naam
messageReceived
kunnen bijvoorbeeld de logica uitvoeren die verantwoordelijk is voor het weergeven van het nieuwe bericht in de berichtenzone. Luisteren naar een specifiek bericht kan via deon
functie. Er kan naar een willekeurig aantal berichtnamen worden geluisterd. Het is ook mogelijk om parameters door te geven aan het bericht, zoals de naam van de auteur en de inhoud van het ontvangen bericht. Zodra de client een bericht ontvangt, wordt er een nieuwdiv
element gemaakt met de naam van de auteur en de inhoud van het bericht in hetinnerHTML
kenmerk. Het wordt toegevoegd aan het hoofdelementdiv
dat de berichten weergeeft.Nu de client een bericht kan ontvangen, configureert u het om berichten te verzenden. Voeg de gemarkeerde code toe aan het
src/index.ts
bestand:import "./css/main.css"; import * as signalR from "@microsoft/signalr"; const divMessages: HTMLDivElement = document.querySelector("#divMessages"); const tbMessage: HTMLInputElement = document.querySelector("#tbMessage"); const btnSend: HTMLButtonElement = document.querySelector("#btnSend"); const username = new Date().getTime(); const connection = new signalR.HubConnectionBuilder() .withUrl("/hub") .build(); connection.on("messageReceived", (username: string, message: string) => { let messages = document.createElement("div"); messages.innerHTML = `<div class="message-author">${username}</div><div>${message}</div>`; divMessages.appendChild(messages); divMessages.scrollTop = divMessages.scrollHeight; }); connection.start().catch(err => document.write(err)); tbMessage.addEventListener("keyup", (e: KeyboardEvent) => { if (e.key === "Enter") { send(); } }); btnSend.addEventListener("click", send); function send() { connection.send("newMessage", username, tbMessage.value) .then(() => tbMessage.value = ""); }
Voor het verzenden van een bericht via de WebSockets-verbinding moet je de
send
-methode aanroepen. De eerste parameter van de methode is de naam van het bericht. De berichtgegevens bevinden zich binnen de andere parameters. In dit voorbeeld wordt een bericht dat is geïdentificeerd alsnewMessage
verzonden naar de server. Het bericht bestaat uit de gebruikersnaam en de gebruikersinvoer uit een tekstvak. Als het verzenden werkt, wordt de waarde van het tekstvak gewist.Voeg de
NewMessage
-methode toe aan de klasseChatHub
:using Microsoft.AspNetCore.SignalR; using System.Threading.Tasks; namespace SignalRWebPack.Hubs { public class ChatHub : Hub { public async Task NewMessage(long username, string message) { await Clients.All.SendAsync("messageReceived", username, message); } } }
Met de voorgaande code worden ontvangen berichten verzonden naar alle verbonden gebruikers zodra de server ze ontvangt. Het is niet nodig om een algemene
on
methode te hebben om alle berichten te ontvangen. Een methode die exact de naam van het bericht draagt, volstaat.In dit voorbeeld verzendt de TypeScript-client een bericht dat is geïdentificeerd als
newMessage
. De C#NewMessage
-methode verwacht de gegevens die door de client worden verzonden. Er wordt een aanroep gedaan op SendAsyncClients.All. De ontvangen berichten worden verzonden naar alle clients die zijn verbonden met de hub.
De app testen
Controleer of de app werkt met de volgende stappen.
Voer Webpack uit in de releasemodus . Voer de volgende opdracht uit in de hoofdmap van het project via het venster Package Manager Console. Als u zich niet in de hoofdmap van het project bevindt, voer dan eerst
cd SignalRWebPack
in voordat u de opdracht invoert.npm run release
Met deze opdracht worden de client-side assets gegenereerd die geleverd worden bij het uitvoeren van de app. De assets worden in de
wwwroot
map geplaatst.Webpack heeft de volgende taken voltooid:
- De inhoud van de
wwwroot
map is leeggemaakt. - Het TypeScript geconverteerd naar JavaScript in een proces dat transpilatie wordt genoemd.
- Het gegenereerde JavaScript beheren om de bestandsgrootte te verkleinen in een proces dat minificatie wordt genoemd.
- De verwerkte JavaScript-, CSS- en HTML-bestanden gekopieerd van
src
naar dewwwroot
map. - De volgende elementen zijn opgenomen in het
wwwroot/index.html
bestand:- Een
<link>
tag, die verwijst naar hetwwwroot/main.<hash>.css
bestand. Deze tag wordt direct vóór de afsluitende</head>
tag geplaatst. - Een
<script>
tag, die verwijst naar het minified-bestandwwwroot/main.<hash>.js
. Deze tag wordt direct na de afsluitende</title>
tag geplaatst.
- Een
- De inhoud van de
Selecteer Foutopsporing>starten zonder foutopsporing om de app in een browser te starten zonder het foutopsporingsprogramma te koppelen. Het
wwwroot/index.html
bestand wordt opgeslagen ophttp://localhost:<port_number>
.Als er compilatiefouten optreden, sluit u de oplossing en opent u deze opnieuw.
Open een andere browserinstantie (elke browser). Plak de URL in de adresbalk.
Kies een van beide browsers, typ iets in het tekstvak Bericht en selecteer de knop Verzenden . De unieke gebruikersnaam en het unieke bericht worden direct op beide pagina's weergegeven.
Aanvullende bronnen
Deze zelfstudie laat zien hoe u Webpack gebruikt in een ASP.NET Core-web-app SignalR om een client te bundelen en te bouwen die is geschreven in TypeScript. Met Webpack kunnen ontwikkelaars de resources aan de clientzijde van een web-app bundelen en bouwen.
In deze handleiding leer je hoe je:
- Een startstructuur voor een ASP.NET Core-app SignalR maken
- De SignalR TypeScript-client configureren
- Een build-pijplijn configureren met behulp van Webpack
- De SignalR server configureren
- Communicatie tussen client en server inschakelen
Voorbeeldcode bekijken of downloaden (hoe download je)
Vereiste voorwaarden
- Visual Studio 2019 met de workload voor ASP.NET en webontwikkeling
- .NET Core SDK 2.2 of hoger
- Node.js met npm
De ASP.NET Core-web-app maken
Configureer Visual Studio om te zoeken naar npm in de omgevingsvariabele PATH . Visual Studio gebruikt standaard de versie van npm die in de installatiemap is gevonden. Volg deze instructies in Visual Studio:
Navigeer naar Hulpprogramma's>Opties>Projecten en Oplossingen>Webpakketbeheer>Externe Webhulpprogramma's.
Selecteer de vermelding $(PATH) in de lijst. Klik op de omhoogwijzende pijl om de vermelding naar de tweede positie in de lijst te verplaatsen.
De Visual Studio-configuratie is voltooid. Het is tijd om het project te creëren.
- Gebruik de menuoptieNieuw>project> en kies de sjabloon ASP.NET Core Web Application.
- Geef het project de naam *SignalRWebPack' en selecteer Maken.
- Selecteer .NET Core in de vervolgkeuzelijst doelframework en selecteer ASP.NET Core 2.2 in de vervolgkeuzelijst frameworkselector. Selecteer de sjabloon Leeg en selecteer Maken.
Webpack en TypeScript configureren
Met de volgende stappen configureert u de conversie van TypeScript naar JavaScript en de bundeling van resources aan de clientzijde.
Voer de volgende opdracht uit in de hoofdmap van het project om een
package.json
bestand te maken:npm init -y
Voeg de gemarkeerde eigenschap toe aan het
package.json
bestand:{ "name": "SignalRWebPack", "version": "1.0.0", "private": true, "description": "", "main": "index.js", "scripts": { "test": "echo \"Error: no test specified\" && exit 1" }, "keywords": [], "author": "", "license": "ISC" }
Het instellen van de
private
-eigenschap optrue
voorkomt pakketinstallatiewaarschuwingen in de volgende stap.Installeer de vereiste npm-pakketten. Voer de volgende opdracht uit vanuit de hoofdmap van het project:
npm install -D -E clean-webpack-plugin@1.0.1 css-loader@2.1.0 html-webpack-plugin@4.0.0-beta.5 mini-css-extract-plugin@0.5.0 ts-loader@5.3.3 typescript@3.3.3 webpack@4.29.3 webpack-cli@3.2.3
Enkele opdrachtdetails die u moet noteren:
- Een versienummer volgt het
@
teken voor elke pakketnaam. npm installeert deze specifieke pakketversies. - Met de
-E
optie wordt het standaardgedrag van npm uitgeschakeld voor het schrijven van semantische versiebeheerbereikoperators naar *packagejson
. Wordt bijvoorbeeld"webpack": "4.29.3"
gebruikt in plaats van"webpack": "^4.29.3"
. Met deze optie voorkomt u onbedoelde upgrades naar nieuwere pakketversies.
Zie de npm-install docs voor meer informatie.
- Een versienummer volgt het
Vervang de
scripts
eigenschap van hetpackage.json
bestand door de volgende code:"scripts": { "build": "webpack --mode=development --watch", "release": "webpack --mode=production", "publish": "npm run release && dotnet publish -c Release" },
Enkele uitleg van de scripts:
-
build
: bundelt de resources aan de clientzijde in de ontwikkelmodus en kijkt naar bestandswijzigingen. De file watcher zorgt ervoor dat de bundel telkens opnieuw wordt gegenereerd wanneer een projectbestand wordt gewijzigd. Demode
optie schakelt productieoptimalisaties uit, zoals boomschudden en minificatie. Gebruikbuild
alleen tijdens ontwikkeling. -
release
: Bundelt de bronnen aan de klantzijde in de productiemodus. -
publish
: voert hetrelease
script uit om de resources aan de clientzijde te bundelen in de productiemodus. Hiermee wordt de opdracht publiceren van de .NET CLI aanroepen om de app te publiceren.
-
Maak een bestand met de naam
*webpack.config.js
in de hoofdmap van het project, met de volgende code:const path = require("path"); const HtmlWebpackPlugin = require("html-webpack-plugin"); const CleanWebpackPlugin = require("clean-webpack-plugin"); const MiniCssExtractPlugin = require("mini-css-extract-plugin"); module.exports = { entry: "./src/index.ts", output: { path: path.resolve(__dirname, "wwwroot"), filename: "[name].[chunkhash].js", publicPath: "/" }, resolve: { extensions: [".js", ".ts"] }, module: { rules: [ { test: /\.ts$/, use: "ts-loader" }, { test: /\.css$/, use: [MiniCssExtractPlugin.loader, "css-loader"] } ] }, plugins: [ new CleanWebpackPlugin(["wwwroot/*"]), new HtmlWebpackPlugin({ template: "./src/index.html" }), new MiniCssExtractPlugin({ filename: "css/[name].[chunkhash].css" }) ] };
Met het voorgaande bestand wordt de webpackcompilatie geconfigureerd. Enkele configuratiedetails die u moet noteren:
- De
output
eigenschap overschrijft de standaardwaarde vandist
. De bundel wordt in plaats daarvan geëmitteerd in dewwwroot
map. - De
resolve.extensions
array omvat.js
om de SignalR JavaScript-client te importeren.
- De
Maak een nieuwe src-map in de hoofdmap van het project om de client-side assets van het project op te slaan.
Maak
src/index.html
met de volgende markeringen.<!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <title>ASP.NET Core SignalR</title> </head> <body> <div id="divMessages" class="messages"> </div> <div class="input-zone"> <label id="lblMessage" for="tbMessage">Message:</label> <input id="tbMessage" class="input-zone-input" type="text" /> <button id="btnSend">Send</button> </div> </body> </html>
De voorgaande HTML definieert de standaardmarkeringen van de startpagina.
Maak een nieuwe src/css-directory. Het doel is om de
.css
bestanden van het project op te slaan.Maken
src/css/main.css
met de volgende markeringen:*, *::before, *::after { box-sizing: border-box; } html, body { margin: 0; padding: 0; } .input-zone { align-items: center; display: flex; flex-direction: row; margin: 10px; } .input-zone-input { flex: 1; margin-right: 10px; } .message-author { font-weight: bold; } .messages { border: 1px solid #000; margin: 10px; max-height: 300px; min-height: 300px; overflow-y: auto; padding: 5px; }
Het voorgaande
main.css
bestand styleert de app.Maak
src/tsconfig.json
met de volgende JSON:{ "compilerOptions": { "target": "es5" } }
Met de voorgaande code wordt de TypeScript-compiler geconfigureerd om ECMAScript 5-compatibele JavaScript te produceren.
Maak
src/index.ts
met de volgende code:import "./css/main.css"; const divMessages: HTMLDivElement = document.querySelector("#divMessages"); const tbMessage: HTMLInputElement = document.querySelector("#tbMessage"); const btnSend: HTMLButtonElement = document.querySelector("#btnSend"); const username = new Date().getTime(); tbMessage.addEventListener("keyup", (e: KeyboardEvent) => { if (e.keyCode === 13) { send(); } }); btnSend.addEventListener("click", send); function send() { }
Met het hierboven genoemde TypeScript worden verwijzingen naar DOM-elementen verkregen en worden er twee eventhandlers gekoppeld:
-
keyup
: Deze gebeurtenis wordt geactiveerd wanneer de gebruiker in hettbMessage
tekstvak typt. Desend
functie wordt aangeroepen wanneer de gebruiker op de Enter-toets drukt. -
click
: Deze gebeurtenis wordt geactiveerd wanneer de gebruiker de knop Verzenden selecteert. Desend
functie wordt aangeroepen.
-
De ASP.NET Core-app configureren
De code in de
Startup.Configure
methode geeft Hello World! weer. Vervang deapp.Run
methode-aanroep door aanroepen naar UseDefaultFiles(IApplicationBuilder) en UseStaticFiles(IApplicationBuilder).app.UseDefaultFiles(); app.UseStaticFiles();
Met de voorgaande code kan de server het
index.html
bestand zoeken en bedienen, ongeacht of de gebruiker de volledige URL of de hoofd-URL van de web-app invoert.Bel AddSignalR in
Startup.ConfigureServices
. Het voegt de SignalR services toe aan het project.services.AddSignalR();
Koppel de route /hub aan de
ChatHub
hub. Voeg de volgende regels toe aan het einde vanStartup.Configure
:app.UseSignalR(options => { options.MapHub<ChatHub>("/hub"); });
Maak een nieuwe map met de naam Hubs in de hoofdmap van het project. Het doel is om de SignalR hub op te slaan, die in de volgende stap wordt gemaakt.
Maak een hub
Hubs/ChatHub.cs
met de volgende code:using Microsoft.AspNetCore.SignalR; using System.Threading.Tasks; namespace SignalRWebPack.Hubs { public class ChatHub : Hub { } }
Voeg de volgende code toe boven aan het
Startup.cs
bestand om deChatHub
verwijzing op te lossen:using SignalRWebPack.Hubs;
Client- en servercommunicatie inschakelen
In de app wordt momenteel een eenvoudig formulier weergegeven om berichten te verzenden. Er gebeurt niets wanneer u dit probeert te doen. De server luistert naar een specifieke route, maar doet niets met verzonden berichten.
Voer de volgende opdracht uit in de hoofdmap van het project:
npm install @aspnet/signalr
Met de voorgaande opdracht wordt de SignalR TypeScript-client geïnstalleerd, waarmee de client berichten naar de server kan verzenden.
Voeg de gemarkeerde code toe aan het
src/index.ts
bestand:import "./css/main.css"; import * as signalR from "@aspnet/signalr"; const divMessages: HTMLDivElement = document.querySelector("#divMessages"); const tbMessage: HTMLInputElement = document.querySelector("#tbMessage"); const btnSend: HTMLButtonElement = document.querySelector("#btnSend"); const username = new Date().getTime(); const connection = new signalR.HubConnectionBuilder() .withUrl("/hub") .build(); connection.on("messageReceived", (username: string, message: string) => { let m = document.createElement("div"); m.innerHTML = `<div class="message-author">${username}</div><div>${message}</div>`; divMessages.appendChild(m); divMessages.scrollTop = divMessages.scrollHeight; }); connection.start().catch(err => document.write(err)); tbMessage.addEventListener("keyup", (e: KeyboardEvent) => { if (e.keyCode === 13) { send(); } }); btnSend.addEventListener("click", send); function send() { }
De voorgaande code ondersteunt het ontvangen van berichten van de server. De
HubConnectionBuilder
klasse maakt een nieuwe opbouwfunctie voor het configureren van de serververbinding. DewithUrl
functie configureert de hub-URL.SignalR schakelt de uitwisseling van berichten tussen een client en een server in. Elk bericht heeft een specifieke naam. Berichten met de naam
messageReceived
kunnen bijvoorbeeld de logica uitvoeren die verantwoordelijk is voor het weergeven van het nieuwe bericht in de berichtenzone. Luisteren naar een specifiek bericht kan via deon
functie. U kunt naar een willekeurig aantal berichtnamen luisteren. Het is ook mogelijk om parameters door te geven aan het bericht, zoals de naam van de auteur en de inhoud van het ontvangen bericht. Zodra de client een bericht ontvangt, wordt er een nieuwdiv
element gemaakt met de naam van de auteur en de inhoud van het bericht in hetinnerHTML
kenmerk. Het nieuwe bericht wordt toegevoegd aan het hoofdelementdiv
dat de berichten weergeeft.Nu de client een bericht kan ontvangen, configureert u het om berichten te verzenden. Voeg de gemarkeerde code toe aan het
src/index.ts
bestand:import "./css/main.css"; import * as signalR from "@aspnet/signalr"; const divMessages: HTMLDivElement = document.querySelector("#divMessages"); const tbMessage: HTMLInputElement = document.querySelector("#tbMessage"); const btnSend: HTMLButtonElement = document.querySelector("#btnSend"); const username = new Date().getTime(); const connection = new signalR.HubConnectionBuilder() .withUrl("/hub") .build(); connection.on("messageReceived", (username: string, message: string) => { let messageContainer = document.createElement("div"); messageContainer.innerHTML = `<div class="message-author">${username}</div><div>${message}</div>`; divMessages.appendChild(messageContainer); divMessages.scrollTop = divMessages.scrollHeight; }); connection.start().catch(err => document.write(err)); tbMessage.addEventListener("keyup", (e: KeyboardEvent) => { if (e.keyCode === 13) { send(); } }); btnSend.addEventListener("click", send); function send() { connection.send("newMessage", username, tbMessage.value) .then(() => tbMessage.value = ""); }
Voor het verzenden van een bericht via de WebSockets-verbinding moet je de
send
-methode aanroepen. De eerste parameter van de methode is de naam van het bericht. De berichtgegevens bevinden zich binnen de andere parameters. In dit voorbeeld wordt een bericht dat is geïdentificeerd alsnewMessage
verzonden naar de server. Het bericht bestaat uit de gebruikersnaam en de gebruikersinvoer uit een tekstvak. Als het verzenden werkt, wordt de waarde van het tekstvak gewist.Voeg de
NewMessage
-methode toe aan de klasseChatHub
:using Microsoft.AspNetCore.SignalR; using System.Threading.Tasks; namespace SignalRWebPack.Hubs { public class ChatHub : Hub { public async Task NewMessage(long username, string message) { await Clients.All.SendAsync("messageReceived", username, message); } } }
Met de voorgaande code worden ontvangen berichten verzonden naar alle verbonden gebruikers zodra de server ze ontvangt. Het is niet nodig om een algemene
on
methode te hebben om alle berichten te ontvangen. Een methode die exact de naam van het bericht draagt, volstaat.In dit voorbeeld verzendt de TypeScript-client een bericht dat is geïdentificeerd als
newMessage
. De C#NewMessage
-methode verwacht de gegevens die door de client worden verzonden. Er wordt een aanroep gedaan op SendAsyncClients.All. De ontvangen berichten worden verzonden naar alle clients die zijn verbonden met de hub.
De app testen
Controleer of de app werkt met de volgende stappen.
Voer Webpack uit in de releasemodus . Voer de volgende opdracht uit in de hoofdmap van het project via het venster Package Manager Console. Als u zich niet in de hoofdmap van het project bevindt, voer dan eerst
cd SignalRWebPack
in voordat u de opdracht invoert.npm run release
Met deze opdracht worden de client-side assets gegenereerd die geleverd worden bij het uitvoeren van de app. De assets worden in de
wwwroot
map geplaatst.Webpack heeft de volgende taken voltooid:
- De inhoud van de
wwwroot
map is leeggemaakt. - Het TypeScript geconverteerd naar JavaScript in een proces dat transpilatie wordt genoemd.
- Het gegenereerde JavaScript beheren om de bestandsgrootte te verkleinen in een proces dat minificatie wordt genoemd.
- De verwerkte JavaScript-, CSS- en HTML-bestanden gekopieerd van
src
naar dewwwroot
map. - De volgende elementen zijn opgenomen in het
wwwroot/index.html
bestand:- Een
<link>
tag, die verwijst naar hetwwwroot/main.<hash>.css
bestand. Deze tag wordt direct vóór de afsluitende</head>
tag geplaatst. - Een
<script>
tag, die verwijst naar het minified-bestandwwwroot/main.<hash>.js
. Deze tag wordt direct na de afsluitende</title>
tag geplaatst.
- Een
- De inhoud van de
Selecteer Foutopsporing>starten zonder foutopsporing om de app in een browser te starten zonder het foutopsporingsprogramma te koppelen. Het
wwwroot/index.html
bestand wordt opgeslagen ophttp://localhost:<port_number>
.Open een andere browserinstantie (elke browser). Plak de URL in de adresbalk.
Kies een van beide browsers, typ iets in het tekstvak Bericht en selecteer de knop Verzenden . De unieke gebruikersnaam en het unieke bericht worden direct op beide pagina's weergegeven.