کار با SignalR Core از طریق یک کلاینت Angular
اندازه‌ی قلم متن
تخمین مدت زمان مطالعه‌ی مطلب: ده دقیقه

نگارش AspNetCore.SignalR 1.0.0-alpha1-final چند روزی هست که منتشر شده‌است. در این مطلب قصد داریم یک برنامه‌ی وب ASP.NET Core 2.0 را به همراه یک Hub ایجاد کرده و سپس این Hub را در یک کلاینت Angular (2+) مورد استفاده قرار دهیم.


پیشنیازها

برای دنبال کردن این مثال فرض بر این است که NET Core 2.0 SDK. و همچنین Angular CLI را نیز پیشتر نصب کرده‌اید. مابقی بحث توسط خط فرمان و ابزارهای dotnet cli و angular cli ادامه داده خواهند شد و الزامی به نصب هیچگونه IDE نیست و این مثال تنها توسط VSCode پیگیری شده‌است.


تدارک ساختار ابتدایی مثال جاری


ساخت برنامه‌ی وب، توسط dotnet cli
ابتدا یک پوشه‌ی جدید را به نام SignalRCore2Sample ایجاد می‌کنیم. سپس داخل این پوشه، پوشه‌ی دیگری را به نام SignalRCore2WebApp ایجاد خواهیم کرد (تصویر فوق). از طریق خط فرمان به این پوشه وارد شده (در ویندوز، در نوار آدرس، دستور cmd.exe را تایپ و enter کنید) و سپس فرمان ذیل را صادر می‌کنیم:
 dotnet new mvc
این دستور، یک برنامه‌ی جدید ASP.NET Core 2.0 را تولید خواهد کرد.

ساخت برنامه‌ی کلاینت، توسط angular cli
سپس از طریق خط فرمان به پوشه‌ی SignalRCore2Sample بازگشته و دستور ذیل را صادر می‌کنیم:
 ng new SignalRCore2Client
این دستور، یک برنامه‌ی Angular را در پوشه‌ی SignalRCore2Client تولید می‌کند (تصویر فوق).

اکنون که در پوشه‌ی ریشه‌ی SignalRCore2Sample قرار داریم، اگر در خط فرمان، دستور . code را صادر کنیم، VSCode هر دو پوشه‌ی وب و client را با هم در اختیار ما قرار می‌دهد:


تکمیل پیشنیازهای برنامه‌ی وب

پس از ایجاد ساختار اولیه‌ی برنامه‌های وب ASP.NET Core و کلاینت Angular، اکنون نیاز است وابستگی جدید AspNetCore.SignalR را به آن معرفی کنیم. به همین جهت به فایل SignalRCore2WebApp.csproj مراجعه کرده و تغییرات ذیل را به آن اعمال می‌کنیم:
<Project Sdk="Microsoft.NET.Sdk.Web">
  <PropertyGroup>
    <TargetFramework>netcoreapp2.0</TargetFramework>
  </PropertyGroup>
  <ItemGroup>
    <PackageReference Include="Microsoft.AspNetCore.All" Version="2.0.0" />
    <PackageReference Include="Microsoft.AspNetCore.SignalR" Version="1.0.0-alpha1-final" />
  </ItemGroup>
  <ItemGroup>
    <DotNetCliToolReference Include="Microsoft.VisualStudio.Web.CodeGeneration.Tools" Version="2.0.0" />
    <DotNetCliToolReference Include="Microsoft.DotNet.Watcher.Tools" Version="2.0.0" />
  </ItemGroup>
</Project>
در اینجا ابتدا بسته‌ی Microsoft.AspNetCore.SignalR اضافه شده‌است. همچنین Microsoft.DotNet.Watcher.Tools را نیز اضافه کرده‌ایم تا بتوان از مزیت build تدریجی پروژه، به ازای هر تغییر صورت گرفته، استفاده کنیم.
پس از این تغییرات، دستور ذیل را در خط فرمان صادر می‌کنیم تا وابستگی‌های پروژه نصب شوند:
 dotnet restore
البته اگر افزونه‌ی #C مخصوص VSCode را نصب کرده باشید، تغییرات فایل csproj را دنبال کرده و پیام restore را نیز ظاهر می‌کند؛ تا همین دستور فوق را به صورت خودکار اجرا کند.
یک نکته: نگارش فعلی افزونه‌ی #C مخصوص VSCode، با تغییر فایل csproj و restore وابستگی‌های آن نیاز دارد یکبار آن‌را بسته و سپس مجددا اجرا کنید، تا اطلاعات intellisense خود را به روز رسانی کند. بنابراین اگر VSCode بلافاصله کلاس‌های مرتبط با بسته‌های جدید را تشخیص نمی‌دهد، علت صرفا این موضوع است.

پس از بازیابی وابستگی‌ها، به ریشه‌ی پروژه‌ی برنامه‌ی وب وارد شده و دستور ذیل را صادر کنید:
 dotnet watch run
این دستور، پروژه را build کرده و سپس بر روی پورت 5000 ارائه می‌دهد. همچنین به ازای هر تغییری در فایل‌های کدهای برنامه، به صورت خودکار برنامه را build کرده و مجددا ارائه می‌دهد.


تکمیل برنامه‌ی وب جهت ارسال پیام‌هایی به کلاینت‌های متصل به آن

پس از افزودن وابستگی‌های مورد نیاز، بازیابی و build برنامه، اکنون نوبت به تعریف یک Hub است، تا از طریق آن بتوان پیام‌هایی را به کلاینت‌های متصل ارسال کرد. به همین جهت یک پوشه‌ی جدید را به نام Hubs به پروژه‌ی وب افزوده و سپس کلاس جدید MessageHub را به صورت ذیل به آن اضافه می‌کنیم:
using System.Threading.Tasks;
using Microsoft.AspNetCore.SignalR;

namespace SignalRCore2WebApp.Hubs
{
    public class MessageHub : Hub
    {
        public Task Send(string message)
        {
            return Clients.All.InvokeAsync("Send", message);
        }
    }
}
این کلاس از کلاس پایه Hub مشتق می‌شود. سپس در متد Send آن می‌توان پیام‌هایی را به کلاینت‌های متصل به برنامه ارسال کرد.

پس از تعریف این Hub، نیاز است به کلاس Startup مراجعه کرده و دو تغییر ذیل را اعمال کنیم:
الف) ثبت و معرفی سرویس SignalR
ابتدا باید SignalR را فعالسازی کرد. به همین جهت نیاز است سرویس‌های آن‌را به صورت یکجا توسط متد الحاقی AddSignalR در متد ConfigureServices به نحو ذیل معرفی کرد:
public void ConfigureServices(IServiceCollection services)
{
   services.AddSignalR();
   services.AddMvc();
}

ب) ثبت مسیریابی دسترسی به Hub
پس از تعریف Hub، مرحله‌ی بعدی، مشخص سازی نحوه‌ی دسترسی به آن است. به همین جهت در متد Configure، به نحو ذیل Hub را معرفی کرده و سپس یک path را برای آن مشخص می‌کنیم:
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
   app.UseSignalR(routes =>
   {
      routes.MapHub<MessageHub>(path: "message");
    });
یعنی اکنون این Hub در آدرس ذیل قابل دسترسی است:
  http://localhost:5000/message
این آدرسی است که در کلاینت Angular، از آن برای اتصال به هاب، استفاده خواهیم کرد.


انتشار پیام‌هایی به تمام کاربران متصل به برنامه

آدرس فوق به تنهایی کار خاصی را انجام نمی‌دهد. از آن جهت اتصال کلاینت‌های برنامه استفاده می‌شود و این کلاینت‌ها پیام‌های رسیده‌ی از طرف برنامه را از این آدرس دریافت خواهند کرد. بنابراین مرحله‌ی بعد، ارسال تعدادی پیام به سمت کلاینت‌ها است. برای این منظور به HomeController برنامه‌ی وب مراجعه کرده و آن‌را به نحو ذیل تغییر می‌دهیم:
using System.Threading.Tasks;
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.SignalR;
using SignalRCore2WebApp.Hubs;

namespace SignalRCore2WebApp.Controllers
{
    public class HomeController : Controller
    {
        private readonly IHubContext<MessageHub> _messageHubContext;
        public HomeController(IHubContext<MessageHub> messageHubContext)
        {
            _messageHubContext = messageHubContext;
        }

        public IActionResult Index()
        {
            return View(); // show the view
        }

        [HttpPost]
        public async Task<IActionResult> Index(string message)
        {
            await _messageHubContext.Clients.All.InvokeAsync("Send", message);
            return View();
        }
    }
}
برای دسترسی به Hubهای تعریف شده می‌توان از سیستم تزریق وابستگی‌ها استفاده کرد. برای این منظور تنها کافی است Hub مدنظر را به عنوان آرگومان جنریک IHubContext تعریف کرد. سپس از طریق آن می‌توان به این context‌، در قسمت‌های مختلف برنامه دسترسی یافت و برای مثال پیام‌هایی را به کاربران ارائه داد.
در این مثال ابتدا View ذیل نمایش داده می‌شود:
@{
    ViewData["Title"] = "Home Page";
}

<form method="post"
      asp-action="Index"
      asp-controller="Home"
      role="form">
  <div class="form-group">
     <label label-for="message">Message: </label>
     <input id="message" name="message" class="form-control"/>
  </div>
  <button class="btn btn-primary" type="submit">Send</button>
</form>
کار آن فرستادن یک پیام به متد Index است. سپس این متد، به کمک context تزریق شده‌ی Hub پیام‌ها، این پیام را به تمام کلاینت‌های متصل ارسال می‌کند.


تکمیل برنامه‌ی کلاینت Angular جهت نمایش پیام‌های رسیده‌ی از طرف سرور

تا اینجا ساختار ابتدایی برنامه‌ی Angular را توسط Angular CLI ایجاد کردیم. اکنون نیاز است وابستگی سمت کلاینت SignalR Core را نصب کنیم. به همین جهت از طریق خط فرمان به پوشه‌ی SignalRCore2Client وارد شده و دستور ذیل را صادر کنید:
 npm install @aspnet/signalr-client --save
پرچم save آن سبب خواهد شد تا این وابستگی علاوه بر نصب، در فایل package.json نیز درج شود.
کلاینت رسمی signalr، هم جاوا اسکریپتی است و هم تایپ‌اسکریپتی. به همین جهت به سادگی توسط یک برنامه‌ی تایپ اسکریپتی Angular قابل استفاده است. کلاس‌های آن‌را در مسیر node_modules\@aspnet\signalr-client\dist\src می‌توانید مشاهده کنید.
در ابتدا، فایل app.component.ts را به نحو ذیل تغییر می‌دهیم:
import { Component, OnInit } from "@angular/core";
import { HubConnection } from "@aspnet/signalr-client";

@Component({
  selector: "app-root",
  templateUrl: "./app.component.html",
  styleUrls: ["./app.component.css"]
})
export class AppComponent implements OnInit {
  hubPath = "http://localhost:5000/message";
  messages: string[] = [];

  ngOnInit(): void {
    const connection = new HubConnection(this.hubPath);
    connection.on("send", data => {
      this.messages.push(data);
    });
    connection.start().then(() => {
      // connection.invoke("send", "Hello");
      console.log("connected.");
    });
  }
}
در اینجا در ابتدا، کلاس HubConnection از ماژول aspnet/signalr-client@ دریافت شده‌است. سپس بر این اساس در ngOnInit، یک وهله از آن که به مسیر Hub تعریف شده‌ی برنامه اشاره می‌کند، ایجاد خواهد شد. هر زمانیکه پیامی از سمت سرور دریافت گردید، این پیام را به لیست messages، که یک آرایه است اضافه می‌کنیم. در آخر برای راه اندازی این اتصال، متد start آ‌ن‌را فراخوانی خواهیم کرد. در اینجا می‌توان یک متد سمت سرور را فراخوانی کرد و یا برقراری اتصال را در کنسول developers مرورگر نمایش داد.
آرایه‌ی messages را به نحو ذیل توسط یک حلقه در قالب این کامپوننت نمایش خواهیم داد:
<div>
  <h1>
    The messages from the server:
  </h1>
  <ul>
    <li *ngFor="let message of messages">
      {{message}}
    </li>
  </ul>
</div>
پس از آن به ریشه‌ی پروژه‌ی کلاینت مراجعه کرده و دستور ذیل را صادر می‌کنیم تا برنامه‌ی Angular ساخته شده و در مرورگر پیش فرض سیستم نمایش داده شود:
  ng serve -o
در این حالت برنامه در آدرس  http://localhost:4200/ قابل دسترسی خواهد بود.


همانطور که مشاهده می‌کنید، پیام خطای ذیل را صادر کرده‌است:
 Failed to load http://localhost:5000/message: Response to preflight request doesn't pass access control check: No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'http://localhost:4200' is therefore not allowed access.
علت اینجا است که برنامه‌ی Angular بر روی پورت 4200 کار می‌کند و برنامه‌ی وب ما بر روی پورت 5000 تنظیم شده‌است. به همین جهت نیاز است CORS را در برنامه‌ی وب تنظیم کرد تا امکان یک چنین دسترسی صادر شود.
برای این منظور به فایل آغازین برنامه‌ی وب مراجعه کرده و سرویس‌های AddCors را به مجموعه‌ی سرویس‌های برنامه اضافه می‌کنیم:
public void ConfigureServices(IServiceCollection services)
{
    services.AddSignalR();
    services.AddCors(options =>
            {
                options.AddPolicy("CorsPolicy",
                    builder => builder
                        .AllowAnyOrigin()
                        .AllowAnyMethod()
                        .AllowAnyHeader()
                        .AllowCredentials());
            });
    services.AddMvc();
}
پس از آن در متد Configure، این سیاست دسترسی باید مورد استفاده قرار گیرد؛ و گرنه این تنظیمات کار نخواهد کرد. محل قرارگیری آن نیز باید پیش از سایر تنظیمات باشد:
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
   app.UseCors(policyName: "CorsPolicy");
اکنون اگر مجددا برنامه‌ی Angular را Refresh کنیم، در console توسعه دهندگان مرورگر، مشاهده خواهیم کرد که اتصال برقرار شده‌است:


در آخر برای آزمایش برنامه، به آدرس http://localhost:5000 یا همان برنامه‌ی وب، مراجعه کرده و پیامی را ارسال کنید. بلافاصله مشاهده خواهید کرد که این پیام توسط کلاینت Angular دریافت شده و نمایش داده می‌شود:



کدهای کامل این مثال را از اینجا می‌توانید دریافت کنید: SignalRCore2Sample.zip
برای اجرا آن، ابتدا به پوشه‌ی SignalRCore2WebApp مراجعه کرده و دو فایل bat آن‌را به ترتیب اجرا کنید. اولی وابستگی‌ها‌ی برنامه را بازیابی می‌کند و دومی برنامه را بر روی پورت 5000 ارائه می‌دهد.
سپس به پوشه‌ی SignalRCore2Client مراجعه کرده و در آنجا نیز دو فایل bat ابتدایی آن‌را به ترتیب اجرا کنید. اولی وابستگی‌های برنامه‌ی Angular را بازیابی می‌کند و دومی برنامه‌ی Angular را بر روی پورت 4200 اجرا خواهد کرد.
  • #
    ‫۶ سال و ۹ ماه قبل، شنبه ۱۱ آذر ۱۳۹۶، ساعت ۲۳:۳۵
    سلام؛ من مثال شما را اجرا می‌کنم کلاینتم وصل می‌شود به هاب ولی سریع بعدش قطع میشه و خطای Error: Websocket closed with status code: 1006  بهم میده ، نمیدونم کجای کارم اشتباه بوده

    • #
      ‫۶ سال و ۹ ماه قبل، یکشنبه ۱۲ آذر ۱۳۹۶، ساعت ۰۲:۰۷
      Websocket با ویندوز 7 سازگاری ندارد. مثالی که ارسال شد با ویندوز 10 اجرا شده بود.
  • #
    ‫۶ سال و ۹ ماه قبل، شنبه ۱۸ آذر ۱۳۹۶، ساعت ۲۱:۴۱
    سلام وقت بخیر؛ در کد‌های بالا با اضافه کردن سرویس AddCors به برنامه مشکل اتصال از پورت دیگر به api حل شد. ولی اگر client بر روی آی پی دیگری نسبت به server  باشد، همان مشکل عدم دسترسی به action  پا برجاست. راه حل این چیه؟
    • #
      ‫۶ سال و ۹ ماه قبل، شنبه ۱۸ آذر ۱۳۹۶، ساعت ۲۲:۱۷
      چه خطایی را در کنسول developer مرورگر دریافت کردید؟
      • #
        ‫۶ سال و ۹ ماه قبل، شنبه ۱۸ آذر ۱۳۹۶، ساعت ۲۲:۲۱
        دقیقا همون خطای مقاله  رو میده ؟

        • #
          ‫۶ سال و ۹ ماه قبل، شنبه ۱۸ آذر ۱۳۹۶، ساعت ۲۲:۲۷
          - CORS تنظیمات اضافه‌تری را نسبت به نکاتی که در مطلب جاری عنوان شد، نیاز ندارد.
          - شما خطای internal server error را دارید که ممکن است به اشتباه به خطای CORS از طرف مرورگر تفسیر شود (مرورگر هر زمانیکه نتواند پاسخ مناسبی را از سرور دریافت کند و این سرور شرایط CORS را هم داشته باشد، بلافاصله خطای CORS را نمایش می‌دهد). در برگه‌ی network کنسول developer مرورگر، خروجی response را دقیقا بررسی کنید تا اصل خطا را مشاهده کنید. همچنین logging را هم در برنامه‌ی خودتان فعال کنید تا خطاهای سمت سرور را دقیقا دریافت کنید.
        • #
          ‫۶ سال و ۹ ماه قبل، چهارشنبه ۲۹ آذر ۱۳۹۶، ساعت ۰۵:۰۱
          ASP.NET Core در نگارش فعلی آن برای خطای 500 یا Internal server error، حتی اگر CORS را تنظیم کرده باشید، هدرهای آن‌را ارسال نمی‌کند. به همین جهت مرورگر خطای عدم تنظیم این هدرها را نمایش می‌دهد.
  • #
    ‫۶ سال و ۶ ماه قبل، شنبه ۱۲ اسفند ۱۳۹۶، ساعت ۱۸:۲۵
    یک نکته‌ی تکمیلی جهت به روز رسانی این مطلب به ASP.NET Core 2.1

    نکات «تغییرات مورد نیاز جهت ارتقاء به ASP.NET Core 2.1» در اینجا هم صادق هستند. سمت سرور آن یکی است. سمت کلاینت آن نیز به همین ترتیب. فقط پس از نصب بسته‌ی جدید SignalR، نیاز است یک سطر زیر را نیز تغییر دهید:
    از
    import { HubConnection } from "@aspnet/signalr-client";
    به
    import { HubConnection } from "@aspnet/signalr";
  • #
    ‫۶ سال و ۶ ماه قبل، یکشنبه ۱۳ اسفند ۱۳۹۶، ساعت ۱۴:۳۱
    سلام وقت بخیر
    در این مقاله پیام دریافتی در سرور از طریق سوکت به تمامی کلاینت‌ها ارسال می‌شه . چطور میشه  به کلاینت خاصی ارسالش کرد ؟ به طور مثال فقط به کاربری که آی دی خاصی داره ارسال بشه 
  • #
    ‫۶ سال و ۳ ماه قبل، شنبه ۵ خرداد ۱۳۹۷، ساعت ۰۰:۵۱
     سلام؛ من کلاس hub رو در لایه سرویس پروژه قرار دادم. میخواهم وقتی کلاینت داده‌ای درون دیتابیس ثبت کرد، درون سرویس جاری یکی از سرویس‌های داخل hub را با استفاده از  interface فراخوانی کنم. لینک زیر بخوبی سوالم را تشریح  کرده:
    http://stackoverflow.com
    ولی طبق پیاده سازی بالا هنگام inject کردن خطا میگیرد. در یک لینک دیگه خواندم که اصلا این روش برای SignalR پیاده سازی نشده. ممنون میشم کمکم کنید.
    • #
      ‫۶ سال و ۳ ماه قبل، شنبه ۵ خرداد ۱۳۹۷، ساعت ۰۱:۴۰
      دقیقا چه خطایی دریافت کردید؟ چون مشکلی نیست:

      با این شرایط البته:

      - سرویس مدنظر پیشتر در فایل آغازین برنامه ثبت شده باشد:

      public void ConfigureServices(IServiceCollection services)
      {
          services.AddTransient<IMyService, MyService>();
      }
      - همچنین هاب هم ثبت شده باشد:
      public void Configure(IApplicationBuilder app, IHostingEnvironment env)
      {
          app.UseSignalR(routes =>
                  {
                      routes.MapHub<MessageHub>(path: "/message");
                  });
      این ثبت هست که کلاس هاب را وارد سیستم تزریق وابستگی‌های ASP.NET Core می‌کند.
  • #
    ‫۵ سال و ۹ ماه قبل، چهارشنبه ۲۸ آذر ۱۳۹۷، ساعت ۰۹:۵۲
    با سلام؛  همانطور که ذکر شده پروژه بر روی .net core sdk 2.0.0  پیاده سازی شده است.
     <PackageReference Include  = "Microsoft.AspNetCore.All"  Version  = "2.0.0"  />
    متاسفانه من نمیتونم این نسخه از sdk رو پیدا کنم و ورژن بالاتری رو هم که نصب می‌کنم  پیغام خطاهایی مبنی بر عدم تطابق نسخه‌ی sdk با خط زیر رو دارم.
     Microsoft.AspNetCore.SignalR
    <PackageReference Include="Microsoft.AspNetCore.SignalR" Version="1.0.0-alpha1-final" />
     به نظرتون باید از چه نسخه ایی استفاده کنم تا این مشکل رو نداشته باشم .
    • #
      ‫۵ سال و ۹ ماه قبل، چهارشنبه ۲۸ آذر ۱۳۹۷، ساعت ۱۰:۴۹
      مطلب «ارتقاء به ASP.NET Core 2.0 - معرفی بسته‌ی Microsoft.AspNetCore.All» را مطالعه کنید. خصوصا این دو قسمت را در نظرات تکمیلی آن:
      - ارتقاء به ASP.NET Core 2.1 - معرفی بسته‌ی Microsoft.AspNetCore. App
      - یک نکته‌ی مهم: روش صحیح به روز رسانی وابستگی‌های پروژه‌های NET Core. 
  • #
    ‫۵ سال و ۷ ماه قبل، پنجشنبه ۴ بهمن ۱۳۹۷، ساعت ۱۷:۲۶
    یک نکته‌ی تکمیلی جهت به روز رسانی  به ASP.NET Core 2.2.1
    در سرویس AddCors  متد AllowAnyOrigin را به
    .SetIsOriginAllowed((host) => true)

    باید تغییر داد در غیر اینصورت با خطای Access to XMLHttpRequest at    مواجه خواهید شد.
  • #
    ‫۵ سال و ۶ ماه قبل، یکشنبه ۱۹ اسفند ۱۳۹۷، ساعت ۱۶:۴۷
    به روز رسانی برای NET Core 2.2.104. و Angular 7 و signalr 1.1.2 
    بسته‌ی سمت کلاینت signalr به صورت زیر تامین می‌شود:
    npm install @aspnet/signalr --save
    نکات Angular ای موجود در مطلب جاری هنوز برقرار هستند؛ منهای تغییر روش وهله سازی hubConnection که به صورت زیر در آمده‌است:
    let hubConnection = new HubConnectionBuilder()
          .withUrl(this.hubPath)
          .build();
    مابقی آن مانند قبل است.

    در سمت سرور هم تنظیمات Cors به صورت زیر تغییر می‌کند به همراه «تغییرات مورد نیاز جهت ارتقاء به ASP.NET Core 2.1»:
            public void ConfigureServices(IServiceCollection services)
            {
                services.AddSignalR();
                services.AddCors(options =>
                {
                    options.AddPolicy("CorsPolicy",
                        builder => builder
                            .WithOrigins("http://localhost:4200") //Note:  The URL must be specified without a trailing slash (/).
                            .AllowAnyMethod()
                            .AllowAnyHeader()
                            //.SetIsOriginAllowed((host) => true)
                            .AllowCredentials());
                });

    پس از اعمال این تغییرات، کدهای به روز شده‌ی انتهای مطلب را از اینجا می‌توانید دریافت کنید: SignalRCore2Sample-SDK-2.2.104.zip
  • #
    ‫۵ سال و ۶ ماه قبل، یکشنبه ۱۹ اسفند ۱۳۹۷، ساعت ۲۰:۳۱
    یک نکته‌ی تکمیلی   
    در صورتی که مثال پست جاری را در Azure  بارگذاری کنید با خطای زیر روبرو می‌شوید :
    WebSocket connection to '(ws://your_domanin_name/message/id=number)' 
    failed: Error during WebSocket handshake:Unexpected response code: 503
    Error: Failed to start the transport 'WebSockets': undefined
    بعد از وارد شدن در وب سایت Azure از منوی سمت چپ ، App Service  را انتخاب کنید . در این بخش لیست سرویس‌ها وجود دارد بعد از انتخاب سرویس مربوطه که قرار است از SignalR  استفاده کند ، در صفحه جدید از منوی سمت چپ گزینه  Application settings را انتخاب می‌کنیم با انتخاب این گزینه در سمت راست یک پنل جدید باز میشود که لیست تنظیمات در اینجا قرار دارد . در این لیست Web sockets   را یافته و آن را On  می‌کنیم و در نهایت Save  را می‌زنیم .  
     
  • #
    ‫۵ سال و ۳ ماه قبل، دوشنبه ۱۳ خرداد ۱۳۹۸، ساعت ۱۶:۵۵
    ارتقاء به NET Core 3x.
    UseSignalR منسوخ شده اعلام می‌شود و با UseEndpoints جانشین خواهد شد:
    // Old code:
    app.UseSignalR(routes =>
    {
        routes.MapHub<SomeHub>("/path");
    });
    
    // New code:
    app.UseEndpoints(endpoints =>
    {
        endpoints.MapHub<SomeHub>("/path");
    });
  • #
    ‫۵ سال و ۱ ماه قبل، پنجشنبه ۲۴ مرداد ۱۳۹۸، ساعت ۱۹:۰۷
    ارتقاء به ASP.NET Core 3.0

    نام بسته‌ی npm سمت کلاینت مخصوص SignalR Core که در ابتدا aspnet/signalr-client@ بود و بعد شد aspnet/signalr@، از این پس microsoft/signalr@ شده‌است!
    npm install @microsoft/signalr --save
  • #
    ‫۴ سال و ۸ ماه قبل، دوشنبه ۲۳ دی ۱۳۹۸، ساعت ۱۹:۵۱
    در این خط کد به تمامی کلاینت‌ها ارسال میشه، چگونه میشه به کلاینتی که بر طبق این مقاله  jwt به سیستم لاگین کرده ارسال کنیم؟
    public Task Send(string message)
    {
        return Clients.All.InvokeAsync("Send", message);
    }
  • #
    ‫۴ سال قبل، سه‌شنبه ۱۸ شهریور ۱۳۹۹، ساعت ۱۶:۵۷
    سلام
    به نظرتون علت ایجاد این پیام چی میتونه باشه؟