Öğretici: TypeScript ve Webpack kullanarak ASP.NET Core SignalR kullanmaya başlama
Tarafından Sébastien Sougnez
Bu öğreticide, TypeScript'te yazılmış bir istemciyi paketlemek ve derlemek için ASP.NET Core SignalR web uygulamasında Webpack kullanımı gösterilmektedir. Webpack, geliştiricilerin bir web uygulamasının istemci tarafı kaynaklarını paketlemesine ve oluşturmasına olanak tanır.
Bu öğreticide aşağıdakilerin nasıl yapılacağını öğreneceksiniz:
- ASP.NET Core SignalR uygulaması oluşturma
- SignalR Sunucuyu yapılandırma
- Webpack kullanarak derleme işlem hattı yapılandırma
- TypeScript istemcisini SignalR yapılandırma
- İstemci ile sunucu arasında iletişimi etkinleştirme
Örnek kodu görüntüleme veya indirme (indirme)
Önkoşullar
- npm ile Node.js
Visual Studio 2022 ile ASP.NET ve web geliştirme iş yükü.
ASP.NET Core web uygulamasını oluşturma
Varsayılan olarak, Visual Studio yükleme dizininde bulunan npm sürümünü kullanır. Visual Studio'yu ortam değişkeninde PATH
npm araması için yapılandırmak için:
Visual Studio’yu başlatın. Başlangıç penceresinde Kod olmadan devam et'i seçin.
Araçlar>Seçenekleri>Projeleri ve Çözümleri>Web Paketi Yönetimi>Dış Web Araçları'na gidin.
Listeden
$(PATH)
girdiyi seçin. Girdiyi listedeki ikinci konuma taşımak için yukarı oku seçin ve Tamam'ı seçin:.
Yeni bir ASP.NET Core web uygulaması oluşturmak için:
- Dosya>Yeni>Proje menü seçeneğini kullanın ve ASP.NET Çekirdek Boş şablonunu seçin. İleri'yi seçin.
- Projeyi
SignalRWebpack
adlandırın ve Oluştur'u seçin. - Çerçeve açılan listesinden .NET 8.0 (Uzun Vadeli Destek) seçeneğini belirleyin. Oluştur'u belirleyin.
Microsoft.TypeScript.MSBuild NuGet paketini projeye ekleyin:
- Çözüm Gezgini proje düğümüne sağ tıklayın ve NuGet Paketlerini Yönet'i seçin. Paketi yüklemek için Gözat sekmesinde sağ tarafta Yükle'yi arayın
Microsoft.TypeScript.MSBuild
ve seçin.
Visual Studio, Projede TypeScript derlemesini etkinleştirerek NuGet paketini Çözüm Gezgini Bağımlılıklar düğümü altına ekler.
Sunucuyu yapılandırma
Bu bölümde, ASP.NET Core web uygulamasını ileti gönderecek ve alacak SignalR şekilde yapılandıracaksınız.
içinde
Program.cs
çağrısı:AddSignalRvar builder = WebApplication.CreateBuilder(args); builder.Services.AddSignalR();
Yeniden, içinde
Program.cs
çağrısı UseDefaultFiles ve UseStaticFiles:var app = builder.Build(); app.UseDefaultFiles(); app.UseStaticFiles();
Yukarıdaki kod, sunucunun dosyayı bulmasını ve sunmasını
index.html
sağlar. Kullanıcı tam URL'sini veya web uygulamasının kök URL'sini girse de dosya sunulur.Hub sınıfı için SignalR proje kökünde
SignalRWebpack/
adlıHubs
yeni bir dizin oluşturun.Aşağıdaki kodla yeni bir dosya
Hubs/ChatHub.cs
oluşturun: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); }
Yukarıdaki kod, alınan iletileri sunucu aldıktan sonra tüm bağlı kullanıcılara yayınlar. Tüm iletileri almak için genel
on
bir yönteme sahip olmak gereksizdir. İleti adından sonra adlandırılmış bir yöntem yeterlidir.Bu örnekte:
- TypeScript istemcisi olarak
newMessage
tanımlanan bir ileti gönderir. - C#
NewMessage
yöntemi, istemci tarafından gönderilen verileri bekler. - İstemciler.Tümü'ne SendAsyncbir çağrı yapılır.
- Alınan iletiler hub'a bağlı tüm istemcilere gönderilir.
- TypeScript istemcisi olarak
Başvuruyu çözümlemek
ChatHub
için üstProgram.cs
kısmına aşağıdakiusing
deyimi ekleyin:using SignalRWebpack.Hubs;
içinde
Program.cs
, yolu hub'a eşleyin/hub
ChatHub
. GörüntülenenHello World!
kodu aşağıdaki kodla değiştirin:app.MapHub<ChatHub>("/hub");
İstemciyi yapılandırma
Bu bölümde, TypeScript'i JavaScript'e dönüştürmek ve HTML ve CSS gibi istemci tarafı kaynaklarını Webpack kullanarak paketlemek için bir Node.js projesi oluşturacaksınız.
Bir dosya oluşturmak
package.json
için proje kökünde aşağıdaki komutu çalıştırın:npm init -y
Vurgulanan özelliği dosyaya
package.json
ekleyin ve dosya değişikliklerini kaydedin:{ "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" }
özelliğini
true
olarakprivate
ayarlamak, sonraki adımda paket yükleme uyarılarını engeller.Gerekli npm paketlerini yükleyin. Proje kökünden aşağıdaki komutu çalıştırın:
npm i -D -E clean-webpack-plugin css-loader html-webpack-plugin mini-css-extract-plugin ts-loader typescript webpack webpack-cli
seçeneği
-E
, npm'nin varsayılan anlamsal sürüm oluşturma aralığı işleçleripackage.json
yazma davranışını devre dışı bırakır. Örneğin,"webpack": "5.76.1"
yerine"webpack": "^5.76.1"
kullanılır. Bu seçenek, daha yeni paket sürümlerine istenmeyen yükseltmeleri engeller.Daha fazla bilgi için npm-install belgelerine bakın.
dosyasının
scripts
package.json
özelliğini aşağıdaki kodla değiştirin:"scripts": { "build": "webpack --mode=development --watch", "release": "webpack --mode=production", "publish": "npm run release && dotnet publish -c Release" },
Aşağıdaki betikler tanımlanır:
build
: İstemci tarafı kaynaklarını geliştirme modunda paketler ve dosya değişikliklerini izler. Dosya izleyicisi, bir proje dosyası her değiştiğinde paketin yeniden oluşturmasına neden olur. seçeneğimode
ağaç sallama ve küçültme gibi üretim iyileştirmelerini devre dışı bırakır. yalnızca geliştirme aşamasında kullanınbuild
.release
: İstemci tarafı kaynaklarını üretim modunda paketler.publish
: İstemci tarafı kaynaklarını üretim modunda paketlemek için betiği çalıştırırrelease
. Uygulamayı yayımlamak için .NET CLI'nın yayımla komutunu çağırır.
Aşağıdaki kodla proje kökünde adlı
webpack.config.js
bir dosya oluşturun: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", }), ], };
Yukarıdaki dosya Webpack derleme işlemini yapılandırıyor:
- özelliği varsayılan
output
değerinidist
geçersiz kılar. Bunun yerine paket dizindewwwroot
yayılır. - Dizi,
resolve.extensions
istemci JavaScript'ini içeri aktarmayı SignalR içerir.js
.
- özelliği varsayılan
İstemci kodu için proje kökünde
SignalRWebpack/
adlısrc
yeni bir dizin oluşturun.Örnek projedeki
src
dizini ve içeriğini proje köküne kopyalayın. Dizinsrc
aşağıdaki dosyaları içerir:index.html
, giriş sayfasının ortak işaretlemesini tanımlar:<!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
, giriş sayfası için CSS stilleri sağlar:*, *::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
, EcMAScript 5 uyumlu JavaScript üretmek için TypeScript derleyicisini yapılandıran:{ "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 = "")); }
Yukarıdaki kod DOM öğelerine başvuruları alır ve iki olay işleyicisi ekler:
keyup
: Kullanıcı metin kutusunatbMessage
yazdığınızda tetiklenir ve kullanıcı Enter tuşuna bastığında işlevini çağırırsend
.click
: Kullanıcı Gönder düğmesini seçtiğinde ve çağrılarsend
işlevi çağrıldığında tetikler.
sınıfı,
HubConnectionBuilder
sunucu bağlantısını yapılandırmak için yeni bir oluşturucu oluşturur. İşlev,withUrl
hub URL'sini yapılandırıyor.SignalR bir istemci ile sunucu arasında ileti alışverişini etkinleştirir. Her iletinin belirli bir adı vardır. Örneğin, ada
messageReceived
sahip iletiler, yeni iletiyi ileti bölgesinde görüntülemekle sorumlu mantığı çalıştırabilir. Belirli bir iletiyi dinlemek işlevi aracılığıylaon
yapılabilir. herhangi bir sayıda ileti adı dinlenebilir. Ayrıca, yazarın adı ve alınan iletinin içeriği gibi parametreleri iletiye geçirmek de mümkündür. İstemci bir ileti aldığında, yazarın adı ve özniteliğindekiinnerHTML
ileti içeriğiyle yenidiv
bir öğe oluşturulur. İletileri görüntüleyen anadiv
öğeye eklenir.WebSockets bağlantısı üzerinden ileti göndermek için yönteminin çağrılması
send
gerekir. Yöntemin ilk parametresi ileti adıdır. İleti verileri diğer parametrelerde yer alır. Bu örnekte, olaraknewMessage
tanımlanan bir ileti sunucuya gönderilir. İleti, bir metin kutusundan kullanıcı adı ve kullanıcı girişinden oluşur. Gönder işe yararsa, metin kutusu değeri temizlenir.
Proje kökünde aşağıdaki komutu çalıştırın:
npm i @microsoft/signalr @types/node
Yukarıdaki komut yüklenir:
- İstemcinin SignalR sunucuya ileti göndermesine izin veren TypeScript istemcisi.
- Node.js için TypeScript türü tanımları, Node.js türlerinin derleme zamanı denetimini etkinleştirir.
Uygulamayı test etme
Uygulamanın aşağıdaki adımlarla çalıştığını onaylayın:
Webpack'i modda
release
çalıştırın. Paket Yöneticisi Konsolu penceresini kullanarak proje kökünde aşağıdaki komutu çalıştırın.npm run release
Bu komut, uygulamayı çalıştırırken sunulacak istemci tarafı varlıklarını oluşturur. Varlıklar klasöre
wwwroot
yerleştirilir.Webpack aşağıdaki görevleri tamamladı:
- Dizinin içeriği temizlenir
wwwroot
. - Transpilation olarak bilinen bir işlemde TypeScript JavaScript'e dönüştürüldü.
- Küçültme olarak bilinen bir işlemde dosya boyutunu küçültmek için oluşturulan JavaScript'i mangled.
- İşlenen JavaScript, CSS ve HTML dosyalarını dizinine
src
wwwroot
kopyaladı. - Dosyaya aşağıdaki öğeler eklendi
wwwroot/index.html
:<link>
Dosyaya başvuranwwwroot/main.<hash>.css
bir etiket. Bu etiket, kapanış</head>
etiketinden hemen önce yerleştirilir.<script>
Küçültülenwwwroot/main.<hash>.js
dosyaya başvuran bir etiket. Bu etiket, kapanış</title>
etiketinden hemen sonra yerleştirilir.
- Dizinin içeriği temizlenir
Hata ayıklayıcıyı eklemeden uygulamayı tarayıcıda başlatmak için Hata ayıklama olmadan başlat'ı seçin.> Dosya
wwwroot/index.html
konumundahttps://localhost:<port>
sunulur.Derleme hataları varsa çözümü kapatıp yeniden açmayı deneyin.
Başka bir tarayıcı örneği (herhangi bir tarayıcı) açın ve URL'yi adres çubuğuna yapıştırın.
Tarayıcılardan birini seçin, İleti metin kutusuna bir şey yazın ve Gönder düğmesini seçin. Benzersiz kullanıcı adı ve ileti her iki sayfada da anında görüntülenir.
Sonraki adımlar
- Kesin türemiş hub'lar
- ASP.NET Core'da kimlik doğrulaması ve yetkilendirme SignalR
- ASP.NET Core için messagepack SignalR hub protokolü
Ek kaynaklar
Bu öğreticide, TypeScript'te yazılmış bir istemciyi paketlemek ve derlemek için ASP.NET Core SignalR web uygulamasında Webpack kullanımı gösterilmektedir. Webpack, geliştiricilerin bir web uygulamasının istemci tarafı kaynaklarını paketlemesine ve oluşturmasına olanak tanır.
Bu öğreticide aşağıdakilerin nasıl yapılacağını öğreneceksiniz:
- ASP.NET Core SignalR uygulaması oluşturma
- SignalR Sunucuyu yapılandırma
- Webpack kullanarak derleme işlem hattı yapılandırma
- TypeScript istemcisini SignalR yapılandırma
- İstemci ile sunucu arasında iletişimi etkinleştirme
Örnek kodu görüntüleme veya indirme (indirme)
Önkoşullar
- npm ile Node.js
Visual Studio 2022 ile ASP.NET ve web geliştirme iş yükü.
ASP.NET Core web uygulamasını oluşturma
Varsayılan olarak, Visual Studio yükleme dizininde bulunan npm sürümünü kullanır. Visual Studio'yu ortam değişkeninde PATH
npm araması için yapılandırmak için:
Visual Studio’yu başlatın. Başlangıç penceresinde Kod olmadan devam et'i seçin.
Araçlar>Seçenekleri>Projeleri ve Çözümleri>Web Paketi Yönetimi>Dış Web Araçları'na gidin.
Listeden
$(PATH)
girdiyi seçin. Girdiyi listedeki ikinci konuma taşımak için yukarı oku seçin ve Tamam'ı seçin:.
Yeni bir ASP.NET Core web uygulaması oluşturmak için:
- Dosya>Yeni>Proje menü seçeneğini kullanın ve ASP.NET Çekirdek Boş şablonunu seçin. İleri'yi seçin.
- Projeyi
SignalRWebpack
adlandırın ve Oluştur'u seçin. - Çerçeve açılan listesinden öğesini seçin
.NET 7.0 (Standard Term Support)
. Oluştur'u belirleyin.
Microsoft.TypeScript.MSBuild NuGet paketini projeye ekleyin:
- Çözüm Gezgini proje düğümüne sağ tıklayın ve NuGet Paketlerini Yönet'i seçin. Paketi yüklemek için Gözat sekmesinde sağ tarafta Yükle'yi arayın
Microsoft.TypeScript.MSBuild
ve seçin.
Visual Studio, Projede TypeScript derlemesini etkinleştirerek NuGet paketini Çözüm Gezgini Bağımlılıklar düğümü altına ekler.
Sunucuyu yapılandırma
Bu bölümde, ASP.NET Core web uygulamasını ileti gönderecek ve alacak SignalR şekilde yapılandıracaksınız.
içinde
Program.cs
çağrısı:AddSignalRvar builder = WebApplication.CreateBuilder(args); builder.Services.AddSignalR();
Yeniden, içinde
Program.cs
çağrısı UseDefaultFiles ve UseStaticFiles:var app = builder.Build(); app.UseDefaultFiles(); app.UseStaticFiles();
Yukarıdaki kod, sunucunun dosyayı bulmasını ve sunmasını
index.html
sağlar. Kullanıcı tam URL'sini veya web uygulamasının kök URL'sini girse de dosya sunulur.Hub sınıfı için SignalR proje kökünde
SignalRWebpack/
adlıHubs
yeni bir dizin oluşturun.Aşağıdaki kodla yeni bir dosya
Hubs/ChatHub.cs
oluşturun: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); }
Yukarıdaki kod, alınan iletileri sunucu aldıktan sonra tüm bağlı kullanıcılara yayınlar. Tüm iletileri almak için genel
on
bir yönteme sahip olmak gereksizdir. İleti adından sonra adlandırılmış bir yöntem yeterlidir.Bu örnekte:
- TypeScript istemcisi olarak
newMessage
tanımlanan bir ileti gönderir. - C#
NewMessage
yöntemi, istemci tarafından gönderilen verileri bekler. - İstemciler.Tümü'ne SendAsyncbir çağrı yapılır.
- Alınan iletiler hub'a bağlı tüm istemcilere gönderilir.
- TypeScript istemcisi olarak
Başvuruyu çözümlemek
ChatHub
için üstProgram.cs
kısmına aşağıdakiusing
deyimi ekleyin:using SignalRWebpack.Hubs;
içinde
Program.cs
, yolu hub'a eşleyin/hub
ChatHub
. GörüntülenenHello World!
kodu aşağıdaki kodla değiştirin:app.MapHub<ChatHub>("/hub");
İstemciyi yapılandırma
Bu bölümde, TypeScript'i JavaScript'e dönüştürmek ve HTML ve CSS gibi istemci tarafı kaynaklarını Webpack kullanarak paketlemek için bir Node.js projesi oluşturacaksınız.
Bir dosya oluşturmak
package.json
için proje kökünde aşağıdaki komutu çalıştırın:npm init -y
Vurgulanan özelliği dosyaya
package.json
ekleyin ve dosya değişikliklerini kaydedin:{ "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" }
özelliğini
true
olarakprivate
ayarlamak, sonraki adımda paket yükleme uyarılarını engeller.Gerekli npm paketlerini yükleyin. Proje kökünden aşağıdaki komutu çalıştırın:
npm i -D -E clean-webpack-plugin css-loader html-webpack-plugin mini-css-extract-plugin ts-loader typescript webpack webpack-cli
seçeneği
-E
, npm'nin varsayılan anlamsal sürüm oluşturma aralığı işleçleripackage.json
yazma davranışını devre dışı bırakır. Örneğin,"webpack": "5.76.1"
yerine"webpack": "^5.76.1"
kullanılır. Bu seçenek, daha yeni paket sürümlerine istenmeyen yükseltmeleri engeller.Daha fazla bilgi için npm-install belgelerine bakın.
dosyasının
scripts
package.json
özelliğini aşağıdaki kodla değiştirin:"scripts": { "build": "webpack --mode=development --watch", "release": "webpack --mode=production", "publish": "npm run release && dotnet publish -c Release" },
Aşağıdaki betikler tanımlanır:
build
: İstemci tarafı kaynaklarını geliştirme modunda paketler ve dosya değişikliklerini izler. Dosya izleyicisi, bir proje dosyası her değiştiğinde paketin yeniden oluşturmasına neden olur. seçeneğimode
ağaç sallama ve küçültme gibi üretim iyileştirmelerini devre dışı bırakır. yalnızca geliştirme aşamasında kullanınbuild
.release
: İstemci tarafı kaynaklarını üretim modunda paketler.publish
: İstemci tarafı kaynaklarını üretim modunda paketlemek için betiği çalıştırırrelease
. Uygulamayı yayımlamak için .NET CLI'nın yayımla komutunu çağırır.
Aşağıdaki kodla proje kökünde adlı
webpack.config.js
bir dosya oluşturun: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", }), ], };
Yukarıdaki dosya Webpack derleme işlemini yapılandırıyor:
- özelliği varsayılan
output
değerinidist
geçersiz kılar. Bunun yerine paket dizindewwwroot
yayılır. - Dizi,
resolve.extensions
istemci JavaScript'ini içeri aktarmayı SignalR içerir.js
.
- özelliği varsayılan
Örnek projedeki
src
dizini ve içeriğini proje köküne kopyalayın. Dizinsrc
aşağıdaki dosyaları içerir:index.html
, giriş sayfasının ortak işaretlemesini tanımlar:<!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
, giriş sayfası için CSS stilleri sağlar:*, *::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
, EcMAScript 5 uyumlu JavaScript üretmek için TypeScript derleyicisini yapılandıran:{ "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 = "")); }
Yukarıdaki kod DOM öğelerine başvuruları alır ve iki olay işleyicisi ekler:
keyup
: Kullanıcı metin kutusunatbMessage
yazdığınızda tetiklenir ve kullanıcı Enter tuşuna bastığında işlevini çağırırsend
.click
: Kullanıcı Gönder düğmesini seçtiğinde ve çağrılarsend
işlevi çağrıldığında tetikler.
sınıfı,
HubConnectionBuilder
sunucu bağlantısını yapılandırmak için yeni bir oluşturucu oluşturur. İşlev,withUrl
hub URL'sini yapılandırıyor.SignalR bir istemci ile sunucu arasında ileti alışverişini etkinleştirir. Her iletinin belirli bir adı vardır. Örneğin, ada
messageReceived
sahip iletiler, yeni iletiyi ileti bölgesinde görüntülemekle sorumlu mantığı çalıştırabilir. Belirli bir iletiyi dinlemek işlevi aracılığıylaon
yapılabilir. herhangi bir sayıda ileti adı dinlenebilir. Ayrıca, yazarın adı ve alınan iletinin içeriği gibi parametreleri iletiye geçirmek de mümkündür. İstemci bir ileti aldığında, yazarın adı ve özniteliğindekiinnerHTML
ileti içeriğiyle yenidiv
bir öğe oluşturulur. İletileri görüntüleyen anadiv
öğeye eklenir.WebSockets bağlantısı üzerinden ileti göndermek için yönteminin çağrılması
send
gerekir. Yöntemin ilk parametresi ileti adıdır. İleti verileri diğer parametrelerde yer alır. Bu örnekte, olaraknewMessage
tanımlanan bir ileti sunucuya gönderilir. İleti, bir metin kutusundan kullanıcı adı ve kullanıcı girişinden oluşur. Gönder işe yararsa, metin kutusu değeri temizlenir.
Proje kökünde aşağıdaki komutu çalıştırın:
npm i @microsoft/signalr @types/node
Yukarıdaki komut yüklenir:
- İstemcinin SignalR sunucuya ileti göndermesine izin veren TypeScript istemcisi.
- Node.js için TypeScript türü tanımları, Node.js türlerinin derleme zamanı denetimini etkinleştirir.
Uygulamayı test etme
Uygulamanın aşağıdaki adımlarla çalıştığını onaylayın:
Webpack'i modda
release
çalıştırın. Paket Yöneticisi Konsolu penceresini kullanarak proje kökünde aşağıdaki komutu çalıştırın.npm run release
Bu komut, uygulamayı çalıştırırken sunulacak istemci tarafı varlıklarını oluşturur. Varlıklar klasöre
wwwroot
yerleştirilir.Webpack aşağıdaki görevleri tamamladı:
- Dizinin içeriği temizlenir
wwwroot
. - Transpilation olarak bilinen bir işlemde TypeScript JavaScript'e dönüştürüldü.
- Küçültme olarak bilinen bir işlemde dosya boyutunu küçültmek için oluşturulan JavaScript'i mangled.
- İşlenen JavaScript, CSS ve HTML dosyalarını dizinine
src
wwwroot
kopyaladı. - Dosyaya aşağıdaki öğeler eklendi
wwwroot/index.html
:<link>
Dosyaya başvuranwwwroot/main.<hash>.css
bir etiket. Bu etiket, kapanış</head>
etiketinden hemen önce yerleştirilir.<script>
Küçültülenwwwroot/main.<hash>.js
dosyaya başvuran bir etiket. Bu etiket, kapanış</title>
etiketinden hemen sonra yerleştirilir.
- Dizinin içeriği temizlenir
Hata ayıklayıcıyı eklemeden uygulamayı tarayıcıda başlatmak için Hata ayıklama olmadan başlat'ı seçin.> Dosya
wwwroot/index.html
konumundahttps://localhost:<port>
sunulur.Derleme hataları varsa çözümü kapatıp yeniden açmayı deneyin.
Başka bir tarayıcı örneği (herhangi bir tarayıcı) açın ve URL'yi adres çubuğuna yapıştırın.
Tarayıcılardan birini seçin, İleti metin kutusuna bir şey yazın ve Gönder düğmesini seçin. Benzersiz kullanıcı adı ve ileti her iki sayfada da anında görüntülenir.
Sonraki adımlar
- Kesin türemiş hub'lar
- ASP.NET Core'da kimlik doğrulaması ve yetkilendirme SignalR
- ASP.NET Core için messagepack SignalR hub protokolü
Ek kaynaklar
Bu öğreticide, TypeScript'te yazılmış bir istemciyi paketlemek ve derlemek için ASP.NET Core SignalR web uygulamasında Webpack kullanımı gösterilmektedir. Webpack, geliştiricilerin bir web uygulamasının istemci tarafı kaynaklarını paketlemesine ve oluşturmasına olanak tanır.
Bu öğreticide aşağıdakilerin nasıl yapılacağını öğreneceksiniz:
- ASP.NET Core SignalR uygulaması oluşturma
- SignalR Sunucuyu yapılandırma
- Webpack kullanarak derleme işlem hattı yapılandırma
- TypeScript istemcisini SignalR yapılandırma
- İstemci ile sunucu arasında iletişimi etkinleştirme
Örnek kodu görüntüleme veya indirme (indirme)
Önkoşullar
- npm ile Node.js
- Visual Studio 2022 ile ASP.NET ve web geliştirme iş yükü.
- .NET 6.0 SDK
ASP.NET Core web uygulamasını oluşturma
Varsayılan olarak, Visual Studio yükleme dizininde bulunan npm sürümünü kullanır. Visual Studio'yu ortam değişkeninde PATH
npm araması için yapılandırmak için:
Visual Studio’yu başlatın. Başlangıç penceresinde Kod olmadan devam et'i seçin.
Araçlar>Seçenekleri>Projeleri ve Çözümleri>Web Paketi Yönetimi>Dış Web Araçları'na gidin.
Listeden
$(PATH)
girdiyi seçin. Girdiyi listedeki ikinci konuma taşımak için yukarı oku seçin ve Tamam'ı seçin:.
Yeni bir ASP.NET Core web uygulaması oluşturmak için:
- Dosya>Yeni>Proje menü seçeneğini kullanın ve ASP.NET Çekirdek Boş şablonunu seçin. İleri'yi seçin.
- Projeyi
SignalRWebpack
adlandırın ve Oluştur'u seçin. - Çerçeve açılan listesinden öğesini seçin
.NET 6.0 (Long Term Support)
. Oluştur'u belirleyin.
Microsoft.TypeScript.MSBuild NuGet paketini projeye ekleyin:
- Çözüm Gezgini proje düğümüne sağ tıklayın ve NuGet Paketlerini Yönet'i seçin. Paketi yüklemek için Gözat sekmesinde sağ tarafta Yükle'yi arayın
Microsoft.TypeScript.MSBuild
ve seçin.
Visual Studio, Projede TypeScript derlemesini etkinleştirerek NuGet paketini Çözüm Gezgini Bağımlılıklar düğümü altına ekler.
Sunucuyu yapılandırma
Bu bölümde, ASP.NET Core web uygulamasını ileti gönderecek ve alacak SignalR şekilde yapılandıracaksınız.
içinde
Program.cs
çağrısı:AddSignalRvar builder = WebApplication.CreateBuilder(args); builder.Services.AddSignalR();
Yeniden, içinde
Program.cs
çağrısı UseDefaultFiles ve UseStaticFiles:var app = builder.Build(); app.UseDefaultFiles(); app.UseStaticFiles();
Yukarıdaki kod, sunucunun dosyayı bulmasını ve sunmasını
index.html
sağlar. Kullanıcı tam URL'sini veya web uygulamasının kök URL'sini girse de dosya sunulur.Hub sınıfı için SignalR proje kökünde
SignalRWebpack/
adlıHubs
yeni bir dizin oluşturun.Aşağıdaki kodla yeni bir dosya
Hubs/ChatHub.cs
oluşturun: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); }
Yukarıdaki kod, alınan iletileri sunucu aldıktan sonra tüm bağlı kullanıcılara yayınlar. Tüm iletileri almak için genel
on
bir yönteme sahip olmak gereksizdir. İleti adından sonra adlandırılmış bir yöntem yeterlidir.Bu örnekte, TypeScript istemcisi olarak
newMessage
tanımlanan bir ileti gönderir. C#NewMessage
yöntemi, istemci tarafından gönderilen verileri bekler. İstemciler.Tümü'ne SendAsyncbir çağrı yapılır. Alınan iletiler hub'a bağlı tüm istemcilere gönderilir.Başvuruyu çözümlemek
ChatHub
için üstProgram.cs
kısmına aşağıdakiusing
deyimi ekleyin:using SignalRWebpack.Hubs;
içinde
Program.cs
, yolu hub'a eşleyin/hub
ChatHub
. GörüntülenenHello World!
kodu aşağıdaki kodla değiştirin:app.MapHub<ChatHub>("/hub");
İstemciyi yapılandırma
Bu bölümde, TypeScript'i JavaScript'e dönüştürmek ve HTML ve CSS gibi istemci tarafı kaynaklarını Webpack kullanarak paketlemek için bir Node.js projesi oluşturacaksınız.
Bir dosya oluşturmak
package.json
için proje kökünde aşağıdaki komutu çalıştırın:npm init -y
Vurgulanan özelliği dosyaya
package.json
ekleyin ve dosya değişikliklerini kaydedin:{ "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" }
özelliğini
true
olarakprivate
ayarlamak, sonraki adımda paket yükleme uyarılarını engeller.Gerekli npm paketlerini yükleyin. Proje kökünden aşağıdaki komutu çalıştırın:
npm i -D -E clean-webpack-plugin css-loader html-webpack-plugin mini-css-extract-plugin ts-loader typescript webpack webpack-cli
seçeneği
-E
, npm'nin varsayılan anlamsal sürüm oluşturma aralığı işleçleripackage.json
yazma davranışını devre dışı bırakır. Örneğin,"webpack": "5.70.0"
yerine"webpack": "^5.70.0"
kullanılır. Bu seçenek, daha yeni paket sürümlerine istenmeyen yükseltmeleri engeller.Daha fazla bilgi için npm-install belgelerine bakın.
dosyasının
scripts
package.json
özelliğini aşağıdaki kodla değiştirin:"scripts": { "build": "webpack --mode=development --watch", "release": "webpack --mode=production", "publish": "npm run release && dotnet publish -c Release" },
Aşağıdaki betikler tanımlanır:
build
: İstemci tarafı kaynaklarını geliştirme modunda paketler ve dosya değişikliklerini izler. Dosya izleyicisi, bir proje dosyası her değiştiğinde paketin yeniden oluşturmasına neden olur. seçeneğimode
ağaç sallama ve küçültme gibi üretim iyileştirmelerini devre dışı bırakır. yalnızca geliştirme aşamasında kullanınbuild
.release
: İstemci tarafı kaynaklarını üretim modunda paketler.publish
: İstemci tarafı kaynaklarını üretim modunda paketlemek için betiği çalıştırırrelease
. Uygulamayı yayımlamak için .NET CLI'nın yayımla komutunu çağırır.
Aşağıdaki kodla proje kökünde adlı
webpack.config.js
bir dosya oluşturun: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", }), ], };
Yukarıdaki dosya Webpack derleme işlemini yapılandırıyor:
- özelliği varsayılan
output
değerinidist
geçersiz kılar. Bunun yerine paket dizindewwwroot
yayılır. - Dizi,
resolve.extensions
istemci JavaScript'ini içeri aktarmayı SignalR içerir.js
.
- özelliği varsayılan
Örnek projedeki
src
dizini ve içeriğini proje köküne kopyalayın. Dizinsrc
aşağıdaki dosyaları içerir:index.html
, giriş sayfasının ortak işaretlemesini tanımlar:<!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
, giriş sayfası için CSS stilleri sağlar:*, *::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
, EcMAScript 5 uyumlu JavaScript üretmek için TypeScript derleyicisini yapılandıran:{ "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 = "")); }
Yukarıdaki kod DOM öğelerine başvuruları alır ve iki olay işleyicisi ekler:
keyup
: Kullanıcı metin kutusunatbMessage
yazdığınızda tetiklenir ve kullanıcı Enter tuşuna bastığında işlevini çağırırsend
.click
: Kullanıcı Gönder düğmesini seçtiğinde ve çağrılarsend
işlevi çağrıldığında tetikler.
sınıfı,
HubConnectionBuilder
sunucu bağlantısını yapılandırmak için yeni bir oluşturucu oluşturur. İşlev,withUrl
hub URL'sini yapılandırıyor.SignalR bir istemci ile sunucu arasında ileti alışverişini etkinleştirir. Her iletinin belirli bir adı vardır. Örneğin, ada
messageReceived
sahip iletiler, yeni iletiyi ileti bölgesinde görüntülemekle sorumlu mantığı çalıştırabilir. Belirli bir iletiyi dinlemek işlevi aracılığıylaon
yapılabilir. herhangi bir sayıda ileti adı dinlenebilir. Ayrıca, yazarın adı ve alınan iletinin içeriği gibi parametreleri iletiye geçirmek de mümkündür. İstemci bir ileti aldığında, yazarın adı ve özniteliğindekiinnerHTML
ileti içeriğiyle yenidiv
bir öğe oluşturulur. İletileri görüntüleyen anadiv
öğeye eklenir.WebSockets bağlantısı üzerinden ileti göndermek için yönteminin çağrılması
send
gerekir. Yöntemin ilk parametresi ileti adıdır. İleti verileri diğer parametrelerde yer alır. Bu örnekte, olaraknewMessage
tanımlanan bir ileti sunucuya gönderilir. İleti, bir metin kutusundan kullanıcı adı ve kullanıcı girişinden oluşur. Gönder işe yararsa, metin kutusu değeri temizlenir.Proje kökünde aşağıdaki komutu çalıştırın:
npm i @microsoft/signalr @types/node
Yukarıdaki komut yüklenir:
- İstemcinin SignalR sunucuya ileti göndermesine izin veren TypeScript istemcisi.
- Node.js için TypeScript türü tanımları, Node.js türlerinin derleme zamanı denetimini etkinleştirir.
Uygulamayı test etme
Uygulamanın aşağıdaki adımlarla çalıştığını onaylayın:
Webpack'i modda
release
çalıştırın. Paket Yöneticisi Konsolu penceresini kullanarak proje kökünde aşağıdaki komutu çalıştırın. Proje kökünde değilseniz, komutu girmeden önce girincd SignalRWebpack
.npm run release
Bu komut, uygulamayı çalıştırırken sunulacak istemci tarafı varlıklarını oluşturur. Varlıklar klasöre
wwwroot
yerleştirilir.Webpack aşağıdaki görevleri tamamladı:
- Dizinin içeriği temizlenir
wwwroot
. - Transpilation olarak bilinen bir işlemde TypeScript JavaScript'e dönüştürüldü.
- Küçültme olarak bilinen bir işlemde dosya boyutunu küçültmek için oluşturulan JavaScript'i mangled.
- İşlenen JavaScript, CSS ve HTML dosyalarını dizinine
src
wwwroot
kopyaladı. - Dosyaya aşağıdaki öğeler eklendi
wwwroot/index.html
:<link>
Dosyaya başvuranwwwroot/main.<hash>.css
bir etiket. Bu etiket, kapanış</head>
etiketinden hemen önce yerleştirilir.<script>
Küçültülenwwwroot/main.<hash>.js
dosyaya başvuran bir etiket. Bu etiket, kapanış</title>
etiketinden hemen sonra yerleştirilir.
- Dizinin içeriği temizlenir
Hata ayıklayıcıyı eklemeden uygulamayı tarayıcıda başlatmak için Hata ayıklama olmadan başlat'ı seçin.> Dosya
wwwroot/index.html
konumundahttps://localhost:<port>
sunulur.Derleme hataları alırsanız çözümü kapatıp yeniden açmayı deneyin.
Başka bir tarayıcı örneği (herhangi bir tarayıcı) açın ve URL'yi adres çubuğuna yapıştırın.
Tarayıcılardan birini seçin, İleti metin kutusuna bir şey yazın ve Gönder düğmesini seçin. Benzersiz kullanıcı adı ve ileti her iki sayfada da anında görüntülenir.
Sonraki adımlar
- Kesin türemiş hub'lar
- ASP.NET Core'da kimlik doğrulaması ve yetkilendirme SignalR
- ASP.NET Core için messagepack SignalR hub protokolü
Ek kaynaklar
Bu öğreticide, TypeScript'te yazılmış bir istemciyi paketlemek ve derlemek için ASP.NET Core SignalR web uygulamasında Webpack kullanımı gösterilmektedir. Webpack, geliştiricilerin bir web uygulamasının istemci tarafı kaynaklarını paketlemesine ve oluşturmasına olanak tanır.
Bu öğreticide aşağıdakilerin nasıl yapılacağını öğreneceksiniz:
- Başlangıç ASP.NET Core SignalR uygulamasının iskelesini oluşturma
- TypeScript istemcisini SignalR yapılandırma
- Webpack kullanarak derleme işlem hattı yapılandırma
- SignalR Sunucuyu yapılandırma
- İstemci ve sunucu arasında iletişimi etkinleştirme
Örnek kodu görüntüleme veya indirme (indirme)
Önkoşullar
ASP.NET Core web uygulamasını oluşturma
Visual Studio'yu PATH ortam değişkeninde npm araması için yapılandırın. Varsayılan olarak, Visual Studio yükleme dizininde bulunan npm sürümünü kullanır. Visual Studio'da şu yönergeleri izleyin:
Visual Studio’yu başlatın. Başlangıç penceresinde Kod olmadan devam et'i seçin.
Araçlar>Seçenekleri>Projeleri ve Çözümleri>Web Paketi Yönetimi>Dış Web Araçları'na gidin.
Listeden $(PATH) girişini seçin. Girdiyi listedeki ikinci konuma taşımak için yukarı oku seçin ve Tamam'ı seçin.
.
Visual Studio yapılandırması tamamlandı.
- Dosya>Yeni>Proje menü seçeneğini kullanın ve ASP.NET Core Web Uygulaması şablonunu seçin. İleri'yi seçin.
- Projeyi *SignalRWebPac'' olarak adlandırın ve Oluştur'u seçin.
- Hedef çerçeve açılan listesinden .NET Core'a tıklayın ve çerçeve seçici açılan listesinden ASP.NET Core 3.1'i seçin. Boş şablonu seçin ve Oluştur'u seçin.
Microsoft.TypeScript.MSBuild
Paketi projeye ekleyin:
- Çözüm Gezgini (sağ bölme) bölümünde proje düğümüne sağ tıklayın ve NuGet Paketlerini Yönet'i seçin. Gözat sekmesinde öğesini arayın
Microsoft.TypeScript.MSBuild
ve sağ taraftaki Yükle'ye tıklayarak paketi yükleyin.
Visual Studio, Projede TypeScript derlemesini etkinleştirerek NuGet paketini Çözüm Gezgini Bağımlılıklar düğümü altına ekler.
Webpack ve TypeScript'i yapılandırma
Aşağıdaki adımlar TypeScript'in JavaScript'e dönüştürülmesi ve istemci tarafı kaynaklarının paketlemesini yapılandırır.
Bir dosya oluşturmak
package.json
için proje kökünde aşağıdaki komutu çalıştırın:npm init -y
Vurgulanan özelliği dosyaya
package.json
ekleyin ve dosya değişikliklerini kaydedin:{ "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" }
özelliğini
true
olarakprivate
ayarlamak, sonraki adımda paket yükleme uyarılarını engeller.Gerekli npm paketlerini yükleyin. Proje kökünden aşağıdaki komutu çalıştırın:
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
Dikkate almak için bazı komut ayrıntıları:
- Her paket adı için bir sürüm numarası işaretine
@
uyar. npm bu belirli paket sürümlerini yükler. - seçeneği,
-E
npm'nin varsayılan anlamsal sürüm oluşturma aralığı işleçlerini *paketejson
yazma davranışını devre dışı bırakır. Örneğin,"webpack": "4.41.5"
yerine"webpack": "^4.41.5"
kullanılır. Bu seçenek, daha yeni paket sürümlerine istenmeyen yükseltmeleri engeller.
Daha fazla ayrıntı için npm-install belgelerine bakın.
- Her paket adı için bir sürüm numarası işaretine
dosyasının
scripts
package.json
özelliğini aşağıdaki kodla değiştirin:"scripts": { "build": "webpack --mode=development --watch", "release": "webpack --mode=production", "publish": "npm run release && dotnet publish -c Release" },
Betiklerin bazı açıklamaları:
build
: İstemci tarafı kaynaklarını geliştirme modunda paketler ve dosya değişikliklerini izler. Dosya izleyicisi, bir proje dosyası her değiştiğinde paketin yeniden oluşturmasına neden olur. seçeneğimode
ağaç sallama ve küçültme gibi üretim iyileştirmelerini devre dışı bırakır. Yalnızca geliştirme aşamasında kullanınbuild
.release
: İstemci tarafı kaynaklarını üretim modunda paketler.publish
: İstemci tarafı kaynaklarını üretim modunda paketlemek için betiği çalıştırırrelease
. Uygulamayı yayımlamak için .NET Core CLI'nın yayımla komutunu çağırır.
Proje kökünde, aşağıdaki kodla adlı
webpack.config.js
bir dosya oluşturun: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" }) ] };
Yukarıdaki dosya Webpack derlemesini yapılandırıyor. Dikkate almak için bazı yapılandırma ayrıntıları:
- özelliği varsayılan
output
değerinidist
geçersiz kılar. Bunun yerine paket dizindewwwroot
yayılır. - Dizi,
resolve.extensions
istemci JavaScript'ini içeri aktarmayı SignalR içerir.js
.
- özelliği varsayılan
Projenin istemci tarafı varlıklarını depolamak için proje kökünde yeni bir src dizini oluşturun.
Aşağıdaki işaretlemeyle oluşturun
src/index.html
.<!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>
Yukarıdaki HTML, giriş sayfasının ortak işaretlemesini tanımlar.
Yeni bir src/css dizini oluşturun. Amacı, projenin dosyalarını depolamaktır
.css
.Aşağıdaki CSS ile oluşturun
src/css/main.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; }
Yukarıdaki
main.css
dosya, uygulamayı stiller.Aşağıdaki JSON ile oluşturun
src/tsconfig.json
:{ "compilerOptions": { "target": "es5" } }
Yukarıdaki kod, EcMAScript 5 uyumlu JavaScript üretmek için TypeScript derleyicisini yapılandırıyor.
Aşağıdaki kodla oluşturun
src/index.ts
: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() { }
Yukarıdaki TypeScript, DOM öğelerine başvuruları alır ve iki olay işleyicisi ekler:
keyup
: Kullanıcı metin kutusuna yazdığınızdatbMessage
bu olay tetikler. kullanıcısend
Enter tuşuna bastığında işlev çağrılır.click
: Kullanıcı Gönder düğmesini seçtiğinde bu olay tetikler.send
işlevi çağrılır.
Uygulamayı yapılandırma
içinde
Startup.Configure
ve UseStaticFiles(IApplicationBuilder)öğesine UseDefaultFiles(IApplicationBuilder) çağrılar ekleyin.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"); }); }
Yukarıdaki kod, sunucunun dosyayı bulmasını ve sunmasını
index.html
sağlar. Kullanıcı tam URL'sini veya web uygulamasının kök URL'sini girse de dosya sunulur.sonunda
Startup.Configure
bir /hub yolunu hub'a eşleyinChatHub
. Merhaba Dünya! ifadesini görüntüleyen kodu aşağıdaki satırla değiştirin:app.UseEndpoints(endpoints => { endpoints.MapHub<ChatHub>("/hub"); });
içinde
Startup.ConfigureServices
öğesini arayın AddSignalR.services.AddSignalR();
Hub'ı depolamak SignalR için proje kökü SignalRWebPack/ içinde Hubs adlı yeni bir dizin oluşturun.
Aşağıdaki kodla hub
Hubs/ChatHub.cs
oluşturun:using Microsoft.AspNetCore.SignalR; using System.Threading.Tasks; namespace SignalRWebPack.Hubs { public class ChatHub : Hub { } }
Başvuruyu çözümlemek
ChatHub
için dosyanın en üstüneStartup.cs
aşağıdakiusing
deyimi ekleyin:using SignalRWebPack.Hubs;
İstemci ve sunucu iletişiminin etkinleştirilmesi
Uygulama şu anda ileti göndermek için temel bir form görüntüler, ancak henüz işlevsel değildir. Sunucu belirli bir yolu dinliyor ancak gönderilen iletilerle hiçbir şey yapmaz.
Proje kökünde aşağıdaki komutu çalıştırın:
npm i @microsoft/signalr @types/node
Yukarıdaki komut yüklenir:
- İstemcinin SignalR sunucuya ileti göndermesine izin veren TypeScript istemcisi.
- Node.js için TypeScript türü tanımları, Node.js türlerinin derleme zamanı denetimini etkinleştirir.
Vurgulanan kodu dosyaya
src/index.ts
ekleyin: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() { }
Yukarıdaki kod, sunucudan ileti almayı destekler. sınıfı,
HubConnectionBuilder
sunucu bağlantısını yapılandırmak için yeni bir oluşturucu oluşturur. İşlev,withUrl
hub URL'sini yapılandırıyor.SignalR bir istemci ile sunucu arasında ileti alışverişini etkinleştirir. Her iletinin belirli bir adı vardır. Örneğin, ada
messageReceived
sahip iletiler, yeni iletiyi ileti bölgesinde görüntülemekle sorumlu mantığı çalıştırabilir. Belirli bir iletiyi dinlemek işlevi aracılığıylaon
yapılabilir. herhangi bir sayıda ileti adı dinlenebilir. Ayrıca, yazarın adı ve alınan iletinin içeriği gibi parametreleri iletiye geçirmek de mümkündür. İstemci bir ileti aldığında, yazarın adı ve özniteliğindekiinnerHTML
ileti içeriğiyle yenidiv
bir öğe oluşturulur. İletileri görüntüleyen anadiv
öğeye eklenir.İstemci bir ileti alabildiğine göre, bu iletiyi ileti gönderecek şekilde yapılandırın. Vurgulanan kodu dosyaya
src/index.ts
ekleyin: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 = ""); }
WebSockets bağlantısı üzerinden ileti göndermek için yönteminin çağrılması
send
gerekir. Yöntemin ilk parametresi ileti adıdır. İleti verileri diğer parametrelerde yer alır. Bu örnekte, olaraknewMessage
tanımlanan bir ileti sunucuya gönderilir. İleti, bir metin kutusundan kullanıcı adı ve kullanıcı girişinden oluşur. Gönder işe yararsa, metin kutusu değeri temizlenir.NewMessage
yönetiminiChatHub
sınıfına ekleyin: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); } } }
Yukarıdaki kod, alınan iletileri sunucu aldıktan sonra tüm bağlı kullanıcılara yayınlar. Tüm iletileri almak için genel
on
bir yönteme sahip olmak gereksizdir. İleti adından sonra adlandırılmış bir yöntem yeterlidir.Bu örnekte, TypeScript istemcisi olarak
newMessage
tanımlanan bir ileti gönderir. C#NewMessage
yöntemi, istemci tarafından gönderilen verileri bekler. İstemciler.Tümü'ne SendAsyncbir çağrı yapılır. Alınan iletiler hub'a bağlı tüm istemcilere gönderilir.
Uygulamayı test etme
Uygulamanın aşağıdaki adımlarla çalıştığını onaylayın.
Webpack'i yayın modunda çalıştırın. Paket Yöneticisi Konsolu penceresini kullanarak proje kökünde aşağıdaki komutu çalıştırın. Proje kökünde değilseniz, komutu girmeden önce girin
cd SignalRWebPack
.npm run release
Bu komut, uygulamayı çalıştırırken sunulacak istemci tarafı varlıklarını oluşturur. Varlıklar klasöre
wwwroot
yerleştirilir.Webpack aşağıdaki görevleri tamamladı:
- Dizinin içeriği temizlenir
wwwroot
. - Transpilation olarak bilinen bir işlemde TypeScript JavaScript'e dönüştürüldü.
- Küçültme olarak bilinen bir işlemde dosya boyutunu küçültmek için oluşturulan JavaScript'i mangled.
- İşlenen JavaScript, CSS ve HTML dosyalarını dizinine
src
wwwroot
kopyaladı. - Dosyaya aşağıdaki öğeler eklendi
wwwroot/index.html
:<link>
Dosyaya başvuranwwwroot/main.<hash>.css
bir etiket. Bu etiket, kapanış</head>
etiketinden hemen önce yerleştirilir.<script>
Küçültülenwwwroot/main.<hash>.js
dosyaya başvuran bir etiket. Bu etiket, kapanış</title>
etiketinden hemen sonra yerleştirilir.
- Dizinin içeriği temizlenir
Hata ayıklayıcıyı eklemeden uygulamayı tarayıcıda başlatmak için Hata ayıklama olmadan başlat'ı seçin.> Dosya
wwwroot/index.html
konumundahttp://localhost:<port_number>
sunulur.Derleme hataları alırsanız çözümü kapatıp yeniden açmayı deneyin.
Başka bir tarayıcı örneği (herhangi bir tarayıcı) açın. URL'yi adres çubuğuna yapıştırın.
Tarayıcılardan birini seçin, İleti metin kutusuna bir şey yazın ve Gönder düğmesini seçin. Benzersiz kullanıcı adı ve ileti her iki sayfada da anında görüntülenir.
Ek kaynaklar
Bu öğreticide, TypeScript'te yazılmış bir istemciyi paketlemek ve derlemek için ASP.NET Core SignalR web uygulamasında Webpack kullanımı gösterilmektedir. Webpack, geliştiricilerin bir web uygulamasının istemci tarafı kaynaklarını paketlemesine ve oluşturmasına olanak tanır.
Bu öğreticide aşağıdakilerin nasıl yapılacağını öğreneceksiniz:
- Başlangıç ASP.NET Core SignalR uygulamasının iskelesini oluşturma
- TypeScript istemcisini SignalR yapılandırma
- Webpack kullanarak derleme işlem hattı yapılandırma
- SignalR Sunucuyu yapılandırma
- İstemci ve sunucu arasında iletişimi etkinleştirme
Örnek kodu görüntüleme veya indirme (indirme)
Önkoşullar
ASP.NET Core web uygulamasını oluşturma
Visual Studio'yu PATH ortam değişkeninde npm araması için yapılandırın. Varsayılan olarak, Visual Studio yükleme dizininde bulunan npm sürümünü kullanır. Visual Studio'da şu yönergeleri izleyin:
Araçlar>Seçenekleri>Projeleri ve Çözümleri>Web Paketi Yönetimi>Dış Web Araçları'na gidin.
Listeden $(PATH) girişini seçin. Girdiyi listedeki ikinci konuma taşımak için yukarı oku seçin.
Visual Studio yapılandırması tamamlandı. Projeyi oluşturma zamanı geldi.
- Dosya>Yeni>Proje menü seçeneğini kullanın ve ASP.NET Core Web Uygulaması şablonunu seçin.
- Projeye *SignalRWebPack' adını verin ve Oluştur'u seçin.
- Hedef çerçeve açılan listesinden .NET Core'ı seçin ve çerçeve seçici açılan listesinden ASP.NET Core 2.2'yi seçin. Boş şablonu seçin ve Oluştur'u seçin.
Webpack ve TypeScript'i yapılandırma
Aşağıdaki adımlar TypeScript'in JavaScript'e dönüştürülmesi ve istemci tarafı kaynaklarının paketlemesini yapılandırır.
Bir dosya oluşturmak
package.json
için proje kökünde aşağıdaki komutu çalıştırın:npm init -y
Vurgulanan özelliği dosyaya
package.json
ekleyin:{ "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" }
özelliğini
true
olarakprivate
ayarlamak, sonraki adımda paket yükleme uyarılarını engeller.Gerekli npm paketlerini yükleyin. Proje kökünden aşağıdaki komutu çalıştırın:
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
Dikkate almak için bazı komut ayrıntıları:
- Her paket adı için bir sürüm numarası işaretine
@
uyar. npm bu belirli paket sürümlerini yükler. - seçeneği,
-E
npm'nin varsayılan anlamsal sürüm oluşturma aralığı işleçlerini *paketejson
yazma davranışını devre dışı bırakır. Örneğin,"webpack": "4.29.3"
yerine"webpack": "^4.29.3"
kullanılır. Bu seçenek, daha yeni paket sürümlerine istenmeyen yükseltmeleri engeller.
Daha fazla ayrıntı için npm-install belgelerine bakın.
- Her paket adı için bir sürüm numarası işaretine
dosyasının
scripts
package.json
özelliğini aşağıdaki kodla değiştirin:"scripts": { "build": "webpack --mode=development --watch", "release": "webpack --mode=production", "publish": "npm run release && dotnet publish -c Release" },
Betiklerin bazı açıklamaları:
build
: İstemci tarafı kaynaklarını geliştirme modunda paketler ve dosya değişikliklerini izler. Dosya izleyicisi, bir proje dosyası her değiştiğinde paketin yeniden oluşturmasına neden olur. seçeneğimode
ağaç sallama ve küçültme gibi üretim iyileştirmelerini devre dışı bırakır. Yalnızca geliştirme aşamasında kullanınbuild
.release
: İstemci tarafı kaynaklarını üretim modunda paketler.publish
: İstemci tarafı kaynaklarını üretim modunda paketlemek için betiği çalıştırırrelease
. Uygulamayı yayımlamak için .NET Core CLI'nın yayımla komutunu çağırır.
Aşağıdaki kodla proje kökünde adlı
*webpack.config.js
bir dosya oluşturun: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" }) ] };
Yukarıdaki dosya Webpack derlemesini yapılandırıyor. Dikkate almak için bazı yapılandırma ayrıntıları:
- özelliği varsayılan
output
değerinidist
geçersiz kılar. Bunun yerine paket dizindewwwroot
yayılır. - Dizi,
resolve.extensions
istemci JavaScript'ini içeri aktarmayı SignalR içerir.js
.
- özelliği varsayılan
Projenin istemci tarafı varlıklarını depolamak için proje kökünde yeni bir src dizini oluşturun.
Aşağıdaki işaretlemeyle oluşturun
src/index.html
.<!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>
Yukarıdaki HTML, giriş sayfasının ortak işaretlemesini tanımlar.
Yeni bir src/css dizini oluşturun. Amacı, projenin dosyalarını depolamaktır
.css
.Aşağıdaki işaretlemeyle oluşturun
src/css/main.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; }
Yukarıdaki
main.css
dosya, uygulamayı stiller.Aşağıdaki JSON ile oluşturun
src/tsconfig.json
:{ "compilerOptions": { "target": "es5" } }
Yukarıdaki kod, EcMAScript 5 uyumlu JavaScript üretmek için TypeScript derleyicisini yapılandırıyor.
Aşağıdaki kodla oluşturun
src/index.ts
: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() { }
Yukarıdaki TypeScript, DOM öğelerine başvuruları alır ve iki olay işleyicisi ekler:
keyup
: Kullanıcı metin kutusuna yazdığınızdatbMessage
bu olay tetikler. kullanıcısend
Enter tuşuna bastığında işlev çağrılır.click
: Kullanıcı Gönder düğmesini seçtiğinde bu olay tetikler.send
işlevi çağrılır.
ASP.NET Core uygulamasını yapılandırma
yönteminde
Startup.Configure
sağlanan kod Merhaba Dünya! görüntüler. yöntem çağrısınıapp.Run
ve UseStaticFiles(IApplicationBuilder)çağrılarıyla UseDefaultFiles(IApplicationBuilder) değiştirin.app.UseDefaultFiles(); app.UseStaticFiles();
Yukarıdaki kod, kullanıcının tam URL'sini veya web uygulamasının
index.html
kök URL'sini girmesi fark etmeksizin sunucunun dosyayı bulmasını ve sunmasını sağlar.çağrısında AddSignalR bulunur
Startup.ConfigureServices
. Hizmetleri projeye ekler SignalR .services.AddSignalR();
Bir /hub yolunu hub'a eşleyin
ChatHub
. öğesinin sonunaStartup.Configure
aşağıdaki satırları ekleyin:app.UseSignalR(options => { options.MapHub<ChatHub>("/hub"); });
Proje kökünde Hubs adlı yeni bir dizin oluşturun. Amacı, sonraki adımda oluşturulan hub'ı depolamaktır SignalR .
Aşağıdaki kodla hub
Hubs/ChatHub.cs
oluşturun:using Microsoft.AspNetCore.SignalR; using System.Threading.Tasks; namespace SignalRWebPack.Hubs { public class ChatHub : Hub { } }
Başvuruyu çözümlemek
ChatHub
için dosyanın en üstüneStartup.cs
aşağıdaki kodu ekleyin:using SignalRWebPack.Hubs;
İstemci ve sunucu iletişiminin etkinleştirilmesi
Uygulama şu anda ileti göndermek için basit bir form görüntüler. Bunu yapmaya çalıştığınızda hiçbir şey olmaz. Sunucu belirli bir yolu dinliyor ancak gönderilen iletilerle hiçbir şey yapmaz.
Proje kökünde aşağıdaki komutu çalıştırın:
npm install @aspnet/signalr
Yukarıdaki komut, istemcinin sunucuya SignalR ileti göndermesini sağlayan TypeScript istemcisini yükler.
Vurgulanan kodu dosyaya
src/index.ts
ekleyin: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() { }
Yukarıdaki kod, sunucudan ileti almayı destekler. sınıfı,
HubConnectionBuilder
sunucu bağlantısını yapılandırmak için yeni bir oluşturucu oluşturur. İşlev,withUrl
hub URL'sini yapılandırıyor.SignalR bir istemci ile sunucu arasında ileti alışverişini etkinleştirir. Her iletinin belirli bir adı vardır. Örneğin, ada
messageReceived
sahip iletiler, yeni iletiyi ileti bölgesinde görüntülemekle sorumlu mantığı çalıştırabilir. Belirli bir iletiyi dinlemek işlevi aracılığıylaon
yapılabilir. İstediğiniz sayıda ileti adını dinleyebilirsiniz. Ayrıca, yazarın adı ve alınan iletinin içeriği gibi parametreleri iletiye geçirmek de mümkündür. İstemci bir ileti aldığında, yazarın adı ve özniteliğindekiinnerHTML
ileti içeriğiyle yenidiv
bir öğe oluşturulur. Yeni ileti, iletileri görüntüleyen anadiv
öğeye eklenir.İstemci bir ileti alabildiğine göre, bu iletiyi ileti gönderecek şekilde yapılandırın. Vurgulanan kodu dosyaya
src/index.ts
ekleyin: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 = ""); }
WebSockets bağlantısı üzerinden ileti göndermek için yönteminin çağrılması
send
gerekir. Yöntemin ilk parametresi ileti adıdır. İleti verileri diğer parametrelerde yer alır. Bu örnekte, olaraknewMessage
tanımlanan bir ileti sunucuya gönderilir. İleti, bir metin kutusundan kullanıcı adı ve kullanıcı girişinden oluşur. Gönder işe yararsa, metin kutusu değeri temizlenir.NewMessage
yönetiminiChatHub
sınıfına ekleyin: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); } } }
Yukarıdaki kod, alınan iletileri sunucu aldıktan sonra tüm bağlı kullanıcılara yayınlar. Tüm iletileri almak için genel
on
bir yönteme sahip olmak gereksizdir. İleti adından sonra adlandırılmış bir yöntem yeterlidir.Bu örnekte, TypeScript istemcisi olarak
newMessage
tanımlanan bir ileti gönderir. C#NewMessage
yöntemi, istemci tarafından gönderilen verileri bekler. İstemciler.Tümü'ne SendAsyncbir çağrı yapılır. Alınan iletiler hub'a bağlı tüm istemcilere gönderilir.
Uygulamayı test etme
Uygulamanın aşağıdaki adımlarla çalıştığını onaylayın.
Webpack'i yayın modunda çalıştırın. Paket Yöneticisi Konsolu penceresini kullanarak proje kökünde aşağıdaki komutu çalıştırın. Proje kökünde değilseniz, komutu girmeden önce girin
cd SignalRWebPack
.npm run release
Bu komut, uygulamayı çalıştırırken sunulacak istemci tarafı varlıklarını oluşturur. Varlıklar klasöre
wwwroot
yerleştirilir.Webpack aşağıdaki görevleri tamamladı:
- Dizinin içeriği temizlenir
wwwroot
. - Transpilation olarak bilinen bir işlemde TypeScript JavaScript'e dönüştürüldü.
- Küçültme olarak bilinen bir işlemde dosya boyutunu küçültmek için oluşturulan JavaScript'i mangled.
- İşlenen JavaScript, CSS ve HTML dosyalarını dizinine
src
wwwroot
kopyaladı. - Dosyaya aşağıdaki öğeler eklendi
wwwroot/index.html
:<link>
Dosyaya başvuranwwwroot/main.<hash>.css
bir etiket. Bu etiket, kapanış</head>
etiketinden hemen önce yerleştirilir.<script>
Küçültülenwwwroot/main.<hash>.js
dosyaya başvuran bir etiket. Bu etiket, kapanış</title>
etiketinden hemen sonra yerleştirilir.
- Dizinin içeriği temizlenir
Hata ayıklayıcıyı eklemeden uygulamayı tarayıcıda başlatmak için Hata ayıklama olmadan başlat'ı seçin.> Dosya
wwwroot/index.html
konumundahttp://localhost:<port_number>
sunulur.Başka bir tarayıcı örneği (herhangi bir tarayıcı) açın. URL'yi adres çubuğuna yapıştırın.
Tarayıcılardan birini seçin, İleti metin kutusuna bir şey yazın ve Gönder düğmesini seçin. Benzersiz kullanıcı adı ve ileti her iki sayfada da anında görüntülenir.
Ek kaynaklar
ASP.NET Core
Geri Bildirim
https://aka.ms/ContentUserFeedback.
Çok yakında: 2024 boyunca, içerik için geri bildirim mekanizması olarak GitHub Sorunları’nı kullanımdan kaldıracak ve yeni bir geri bildirim sistemiyle değiştireceğiz. Daha fazla bilgi için bkz.Gönderin ve geri bildirimi görüntüleyin