Öğretici: TypeScript ve Webpack kullanarak ASP.NET Core SignalR kullanmaya başlama

Not

Bu, bu makalenin en son sürümü değildir. Geçerli sürüm için bu makalenin .NET 8 sürümüne bakın.

Önemli

Bu bilgiler, ticari olarak piyasaya sürülmeden önce önemli ölçüde değiştirilebilen bir yayın öncesi ürünle ilgilidir. Burada verilen bilgilerle ilgili olarak Microsoft açık veya zımni hiçbir garanti vermez.

Geçerli sürüm için bu makalenin .NET 8 sürümüne bakın.

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

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.

  1. Araçlar>Seçenekleri>Projeleri ve Çözümleri>Web Paketi Yönetimi>Dış Web Araçları'na gidin.

  2. Listeden $(PATH) girdiyi seçin. Girdiyi listedeki ikinci konuma taşımak için yukarı oku seçin ve Tamam'ı seçin:

    Visual Studio Yapılandırması.

Yeni bir ASP.NET Core web uygulaması oluşturmak için:

  1. Dosya>Yeni>Proje menü seçeneğini kullanın ve ASP.NET Çekirdek Boş şablonunu seçin. İleri'yi seçin.
  2. Projeyi SignalRWebpackadlandırın ve Oluştur'u seçin.
  3. Ç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:

  1. Çö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.

  1. içinde Program.csçağrısı:AddSignalR

    var builder = WebApplication.CreateBuilder(args);
    
    builder.Services.AddSignalR();
    
  2. 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.

  3. Hub sınıfı için SignalR proje kökünde SignalRWebpack/adlı Hubs yeni bir dizin oluşturun.

  4. Aşağıdaki kodla yeni bir dosya Hubs/ChatHub.csoluş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 newMessagetanı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.
  5. Başvuruyu çözümlemek ChatHub için üst Program.cs kısmına aşağıdaki using deyimi ekleyin:

    using SignalRWebpack.Hubs;
    
  6. içinde Program.cs, yolu hub'a eşleyin /hubChatHub . Görüntülenen Hello 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.

  1. Bir dosya oluşturmak package.json için proje kökünde aşağıdaki komutu çalıştırın:

    npm init -y
    
  2. 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 olarak private ayarlamak, sonraki adımda paket yükleme uyarılarını engeller.

  3. 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çleri package.jsonyazma 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.

  4. dosyasının scriptspackage.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ği mode ağaç sallama ve küçültme gibi üretim iyileştirmelerini devre dışı bırakır. yalnızca geliştirme aşamasında kullanın build .
    • release: İstemci tarafı kaynaklarını üretim modunda paketler.
    • publish: İstemci tarafı kaynaklarını üretim modunda paketlemek için betiği çalıştırır release . Uygulamayı yayımlamak için .NET CLI'nın yayımla komutunu çağırır.
  5. 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ğerini distgeçersiz kılar. Bunun yerine paket dizinde wwwroot yayılır.
    • Dizi, resolve.extensions istemci JavaScript'ini içeri aktarmayı SignalR içerir.js.
  6. İstemci kodu için proje kökünde SignalRWebpack/adlı src yeni bir dizin oluşturun.

  7. Örnek projedeki src dizini ve içeriğini proje köküne kopyalayın. Dizin src 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 kutusuna tbMessage 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ılar send 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ığıyla on 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ğindeki innerHTML ileti içeriğiyle yeni div bir öğe oluşturulur. İletileri görüntüleyen ana div öğ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, olarak newMessage 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.

  8. Proje kökünde aşağıdaki komutu çalıştırın:

    npm i @microsoft/signalr @types/node
    

    Yukarıdaki komut yüklenir:

Uygulamayı test etme

Uygulamanın aşağıdaki adımlarla çalıştığını onaylayın:

  1. 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 srcwwwroot kopyaladı.
    • Dosyaya aşağıdaki öğeler eklendi wwwroot/index.html :
      • <link> Dosyaya başvuran wwwroot/main.<hash>.css bir etiket. Bu etiket, kapanış </head> etiketinden hemen önce yerleştirilir.
      • <script> Küçültülen wwwroot/main.<hash>.js dosyaya başvuran bir etiket. Bu etiket, kapanış </title> etiketinden hemen sonra yerleştirilir.
  2. 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 konumunda https://localhost:<port>sunulur.

    Derleme hataları varsa çözümü kapatıp yeniden açmayı deneyin.

  3. Başka bir tarayıcı örneği (herhangi bir tarayıcı) açın ve URL'yi adres çubuğuna yapıştırın.

  4. 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.

her iki tarayıcı penceresi de görüntülenen ileti

Sonraki adımlar

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

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.

  1. Araçlar>Seçenekleri>Projeleri ve Çözümleri>Web Paketi Yönetimi>Dış Web Araçları'na gidin.

  2. Listeden $(PATH) girdiyi seçin. Girdiyi listedeki ikinci konuma taşımak için yukarı oku seçin ve Tamam'ı seçin:

    Visual Studio Yapılandırması.

Yeni bir ASP.NET Core web uygulaması oluşturmak için:

  1. Dosya>Yeni>Proje menü seçeneğini kullanın ve ASP.NET Çekirdek Boş şablonunu seçin. İleri'yi seçin.
  2. Projeyi SignalRWebpackadlandırın ve Oluştur'u seçin.
  3. Ç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:

  1. Çö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.

  1. içinde Program.csçağrısı:AddSignalR

    var builder = WebApplication.CreateBuilder(args);
    
    builder.Services.AddSignalR();
    
  2. 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.

  3. Hub sınıfı için SignalR proje kökünde SignalRWebpack/adlı Hubs yeni bir dizin oluşturun.

  4. Aşağıdaki kodla yeni bir dosya Hubs/ChatHub.csoluş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 newMessagetanı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.
  5. Başvuruyu çözümlemek ChatHub için üst Program.cs kısmına aşağıdaki using deyimi ekleyin:

    using SignalRWebpack.Hubs;
    
  6. içinde Program.cs, yolu hub'a eşleyin /hubChatHub . Görüntülenen Hello 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.

  1. Bir dosya oluşturmak package.json için proje kökünde aşağıdaki komutu çalıştırın:

    npm init -y
    
  2. 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 olarak private ayarlamak, sonraki adımda paket yükleme uyarılarını engeller.

  3. 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çleri package.jsonyazma 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.

  4. dosyasının scriptspackage.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ği mode ağaç sallama ve küçültme gibi üretim iyileştirmelerini devre dışı bırakır. yalnızca geliştirme aşamasında kullanın build .
    • release: İstemci tarafı kaynaklarını üretim modunda paketler.
    • publish: İstemci tarafı kaynaklarını üretim modunda paketlemek için betiği çalıştırır release . Uygulamayı yayımlamak için .NET CLI'nın yayımla komutunu çağırır.
  5. 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ğerini distgeçersiz kılar. Bunun yerine paket dizinde wwwroot yayılır.
    • Dizi, resolve.extensions istemci JavaScript'ini içeri aktarmayı SignalR içerir.js.
  6. Örnek projedeki src dizini ve içeriğini proje köküne kopyalayın. Dizin src 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 kutusuna tbMessage 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ılar send 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ığıyla on 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ğindeki innerHTML ileti içeriğiyle yeni div bir öğe oluşturulur. İletileri görüntüleyen ana div öğ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, olarak newMessage 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.

  7. Proje kökünde aşağıdaki komutu çalıştırın:

    npm i @microsoft/signalr @types/node
    

    Yukarıdaki komut yüklenir:

Uygulamayı test etme

Uygulamanın aşağıdaki adımlarla çalıştığını onaylayın:

  1. 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 srcwwwroot kopyaladı.
    • Dosyaya aşağıdaki öğeler eklendi wwwroot/index.html :
      • <link> Dosyaya başvuran wwwroot/main.<hash>.css bir etiket. Bu etiket, kapanış </head> etiketinden hemen önce yerleştirilir.
      • <script> Küçültülen wwwroot/main.<hash>.js dosyaya başvuran bir etiket. Bu etiket, kapanış </title> etiketinden hemen sonra yerleştirilir.
  2. 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 konumunda https://localhost:<port>sunulur.

    Derleme hataları varsa çözümü kapatıp yeniden açmayı deneyin.

  3. Başka bir tarayıcı örneği (herhangi bir tarayıcı) açın ve URL'yi adres çubuğuna yapıştırın.

  4. 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.

her iki tarayıcı penceresi de görüntülenen ileti

Sonraki adımlar

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

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:

  1. Visual Studio’yu başlatın. Başlangıç penceresinde Kod olmadan devam et'i seçin.

  2. Araçlar>Seçenekleri>Projeleri ve Çözümleri>Web Paketi Yönetimi>Dış Web Araçları'na gidin.

  3. Listeden $(PATH) girdiyi seçin. Girdiyi listedeki ikinci konuma taşımak için yukarı oku seçin ve Tamam'ı seçin:

    Visual Studio Yapılandırması.

Yeni bir ASP.NET Core web uygulaması oluşturmak için:

  1. Dosya>Yeni>Proje menü seçeneğini kullanın ve ASP.NET Çekirdek Boş şablonunu seçin. İleri'yi seçin.
  2. Projeyi SignalRWebpackadlandırın ve Oluştur'u seçin.
  3. Ç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:

  1. Çö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.

  1. içinde Program.csçağrısı:AddSignalR

    var builder = WebApplication.CreateBuilder(args);
    
    builder.Services.AddSignalR();
    
  2. 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.

  3. Hub sınıfı için SignalR proje kökünde SignalRWebpack/adlı Hubs yeni bir dizin oluşturun.

  4. Aşağıdaki kodla yeni bir dosya Hubs/ChatHub.csoluş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 newMessagetanı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.

  5. Başvuruyu çözümlemek ChatHub için üst Program.cs kısmına aşağıdaki using deyimi ekleyin:

    using SignalRWebpack.Hubs;
    
  6. içinde Program.cs, yolu hub'a eşleyin /hubChatHub . Görüntülenen Hello 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.

  1. Bir dosya oluşturmak package.json için proje kökünde aşağıdaki komutu çalıştırın:

    npm init -y
    
  2. 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 olarak private ayarlamak, sonraki adımda paket yükleme uyarılarını engeller.

  3. 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çleri package.jsonyazma 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.

  4. dosyasının scriptspackage.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ği mode ağaç sallama ve küçültme gibi üretim iyileştirmelerini devre dışı bırakır. yalnızca geliştirme aşamasında kullanın build .
    • release: İstemci tarafı kaynaklarını üretim modunda paketler.
    • publish: İstemci tarafı kaynaklarını üretim modunda paketlemek için betiği çalıştırır release . Uygulamayı yayımlamak için .NET CLI'nın yayımla komutunu çağırır.
  5. 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ğerini distgeçersiz kılar. Bunun yerine paket dizinde wwwroot yayılır.
    • Dizi, resolve.extensions istemci JavaScript'ini içeri aktarmayı SignalR içerir.js.
  6. Örnek projedeki src dizini ve içeriğini proje köküne kopyalayın. Dizin src 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 kutusuna tbMessage 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ılar send 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ığıyla on 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ğindeki innerHTML ileti içeriğiyle yeni div bir öğe oluşturulur. İletileri görüntüleyen ana div öğ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, olarak newMessage 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.

  7. Proje kökünde aşağıdaki komutu çalıştırın:

    npm i @microsoft/signalr @types/node
    

    Yukarıdaki komut yüklenir:

Uygulamayı test etme

Uygulamanın aşağıdaki adımlarla çalıştığını onaylayın:

  1. 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 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 srcwwwroot kopyaladı.
    • Dosyaya aşağıdaki öğeler eklendi wwwroot/index.html :
      • <link> Dosyaya başvuran wwwroot/main.<hash>.css bir etiket. Bu etiket, kapanış </head> etiketinden hemen önce yerleştirilir.
      • <script> Küçültülen wwwroot/main.<hash>.js dosyaya başvuran bir etiket. Bu etiket, kapanış </title> etiketinden hemen sonra yerleştirilir.
  2. 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 konumunda https://localhost:<port>sunulur.

    Derleme hataları alırsanız çözümü kapatıp yeniden açmayı deneyin.

  3. Başka bir tarayıcı örneği (herhangi bir tarayıcı) açın ve URL'yi adres çubuğuna yapıştırın.

  4. 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.

her iki tarayıcı penceresi de görüntülenen ileti

Sonraki adımlar

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:

  1. Visual Studio’yu başlatın. Başlangıç penceresinde Kod olmadan devam et'i seçin.

  2. Araçlar>Seçenekleri>Projeleri ve Çözümleri>Web Paketi Yönetimi>Dış Web Araçları'na gidin.

  3. 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ı.

Visual Studio yapılandırması tamamlandı.

  1. Dosya>Yeni>Proje menü seçeneğini kullanın ve ASP.NET Core Web Uygulaması şablonunu seçin. İleri'yi seçin.
  2. Projeyi *SignalRWebPac'' olarak adlandırın ve Oluştur'u seçin.
  3. 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:

  1. Çö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.MSBuildve 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.

  1. Bir dosya oluşturmak package.json için proje kökünde aşağıdaki komutu çalıştırın:

    npm init -y
    
  2. 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 olarak private ayarlamak, sonraki adımda paket yükleme uyarılarını engeller.

  3. 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.

  4. dosyasının scriptspackage.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ği mode ağaç sallama ve küçültme gibi üretim iyileştirmelerini devre dışı bırakır. Yalnızca geliştirme aşamasında kullanın build .
    • release: İstemci tarafı kaynaklarını üretim modunda paketler.
    • publish: İstemci tarafı kaynaklarını üretim modunda paketlemek için betiği çalıştırır release . Uygulamayı yayımlamak için .NET Core CLI'nın yayımla komutunu çağırır.
  5. Proje kökünde, aşağıdaki kodla adlı webpack.config.jsbir 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ğerini distgeçersiz kılar. Bunun yerine paket dizinde wwwroot yayılır.
    • Dizi, resolve.extensions istemci JavaScript'ini içeri aktarmayı SignalR içerir.js.
  6. Projenin istemci tarafı varlıklarını depolamak için proje kökünde yeni bir src dizini oluşturun.

  7. 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.

  8. Yeni bir src/css dizini oluşturun. Amacı, projenin dosyalarını depolamaktır .css .

  9. 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.

  10. Aşağıdaki JSON ile oluşturunsrc/tsconfig.json:

    {
      "compilerOptions": {
        "target": "es5"
      }
    }
    

    Yukarıdaki kod, EcMAScript 5 uyumlu JavaScript üretmek için TypeScript derleyicisini yapılandırıyor.

  11. 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ızda tbMessagebu 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

  1. içinde Startup.Configureve 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.

  2. sonunda Startup.Configurebir /hub yolunu hub'a eşleyin ChatHub . Merhaba Dünya! ifadesini görüntüleyen kodu aşağıdaki satırla değiştirin:

    app.UseEndpoints(endpoints =>
    {
        endpoints.MapHub<ChatHub>("/hub");
    });
    
  3. içinde Startup.ConfigureServicesöğesini arayın AddSignalR.

    services.AddSignalR();
    
  4. Hub'ı depolamak SignalR için proje kökü SignalRWebPack/ içinde Hubs adlı yeni bir dizin oluşturun.

  5. 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
        {
        }
    }
    
  6. Başvuruyu çözümlemek ChatHub için dosyanın en üstüne Startup.cs aşağıdaki using 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.

  1. Proje kökünde aşağıdaki komutu çalıştırın:

    npm i @microsoft/signalr @types/node
    

    Yukarıdaki komut yüklenir:

  2. 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ığıyla on 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ğindeki innerHTML ileti içeriğiyle yeni div bir öğe oluşturulur. İletileri görüntüleyen ana div öğeye eklenir.

  3. İ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, olarak newMessage 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.

  4. NewMessage yönetimini ChatHub 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 newMessagetanı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.

  1. 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 srcwwwroot kopyaladı.
    • Dosyaya aşağıdaki öğeler eklendi wwwroot/index.html :
      • <link> Dosyaya başvuran wwwroot/main.<hash>.css bir etiket. Bu etiket, kapanış </head> etiketinden hemen önce yerleştirilir.
      • <script> Küçültülen wwwroot/main.<hash>.js dosyaya başvuran bir etiket. Bu etiket, kapanış </title> etiketinden hemen sonra yerleştirilir.
  2. 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 konumunda http://localhost:<port_number>sunulur.

    Derleme hataları alırsanız çözümü kapatıp yeniden açmayı deneyin.

  3. Başka bir tarayıcı örneği (herhangi bir tarayıcı) açın. URL'yi adres çubuğuna yapıştırın.

  4. 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.

her iki tarayıcı penceresi de görüntülenen ileti

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:

  1. Araçlar>Seçenekleri>Projeleri ve Çözümleri>Web Paketi Yönetimi>Dış Web Araçları'na gidin.

  2. Listeden $(PATH) girişini seçin. Girdiyi listedeki ikinci konuma taşımak için yukarı oku seçin.

    Visual Studio Yapılandırması

Visual Studio yapılandırması tamamlandı. Projeyi oluşturma zamanı geldi.

  1. Dosya>Yeni>Proje menü seçeneğini kullanın ve ASP.NET Core Web Uygulaması şablonunu seçin.
  2. Projeye *SignalRWebPack' adını verin ve Oluştur'u seçin.
  3. 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.

  1. Bir dosya oluşturmak package.json için proje kökünde aşağıdaki komutu çalıştırın:

    npm init -y
    
  2. 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 olarak private ayarlamak, sonraki adımda paket yükleme uyarılarını engeller.

  3. 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.

  4. dosyasının scriptspackage.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ği mode ağaç sallama ve küçültme gibi üretim iyileştirmelerini devre dışı bırakır. Yalnızca geliştirme aşamasında kullanın build .
    • release: İstemci tarafı kaynaklarını üretim modunda paketler.
    • publish: İstemci tarafı kaynaklarını üretim modunda paketlemek için betiği çalıştırır release . Uygulamayı yayımlamak için .NET Core CLI'nın yayımla komutunu çağırır.
  5. 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ğerini distgeçersiz kılar. Bunun yerine paket dizinde wwwroot yayılır.
    • Dizi, resolve.extensions istemci JavaScript'ini içeri aktarmayı SignalR içerir.js.
  6. Projenin istemci tarafı varlıklarını depolamak için proje kökünde yeni bir src dizini oluşturun.

  7. 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.

  8. Yeni bir src/css dizini oluşturun. Amacı, projenin dosyalarını depolamaktır .css .

  9. 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.

  10. Aşağıdaki JSON ile oluşturunsrc/tsconfig.json:

    {
      "compilerOptions": {
        "target": "es5"
      }
    }
    

    Yukarıdaki kod, EcMAScript 5 uyumlu JavaScript üretmek için TypeScript derleyicisini yapılandırıyor.

  11. 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ızda tbMessage 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

  1. 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.

  2. çağrısında AddSignalR bulunur Startup.ConfigureServices. Hizmetleri projeye ekler SignalR .

    services.AddSignalR();
    
  3. Bir /hub yolunu hub'a eşleyinChatHub. öğesinin sonuna Startup.Configureaşağıdaki satırları ekleyin:

    app.UseSignalR(options =>
    {
        options.MapHub<ChatHub>("/hub");
    });
    
  4. Proje kökünde Hubs adlı yeni bir dizin oluşturun. Amacı, sonraki adımda oluşturulan hub'ı depolamaktır SignalR .

  5. 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
        {
        }
    }
    
  6. Başvuruyu çözümlemek ChatHub için dosyanın en üstüne Startup.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.

  1. 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.

  2. 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ığıyla on 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ğindeki innerHTML ileti içeriğiyle yeni div bir öğe oluşturulur. Yeni ileti, iletileri görüntüleyen ana div öğeye eklenir.

  3. İ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, olarak newMessage 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.

  4. NewMessage yönetimini ChatHub 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 newMessagetanı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.

  1. 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 srcwwwroot kopyaladı.
    • Dosyaya aşağıdaki öğeler eklendi wwwroot/index.html :
      • <link> Dosyaya başvuran wwwroot/main.<hash>.css bir etiket. Bu etiket, kapanış </head> etiketinden hemen önce yerleştirilir.
      • <script> Küçültülen wwwroot/main.<hash>.js dosyaya başvuran bir etiket. Bu etiket, kapanış </title> etiketinden hemen sonra yerleştirilir.
  2. 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 konumunda http://localhost:<port_number>sunulur.

  3. Başka bir tarayıcı örneği (herhangi bir tarayıcı) açın. URL'yi adres çubuğuna yapıştırın.

  4. 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.

her iki tarayıcı penceresi de görüntülenen ileti

Ek kaynaklar