跳至页脚内容
.NET 帮助

Signalr C#(开发者如何使用)

现代网络依赖于互动性和实时反馈。 在构建响应式应用程序时,实时网络功能是必不可少的。这就是SignalR的发光点。 ASP.NET Core SignalR 是一个库,可以让您的应用程序更容易地添加实时网络功能,比您想象的要简单。

在本教程中,我们将开启一段SignalR基础知识和细微差别的旅程。 让我们深入了解!

ASP.NET Core中的SignalR介绍

ASP.NET Core SignalR提供了一个API,用于使用WebSockets和其他技术(如服务器发送事件)创建实时网络功能。 这不仅仅限于ASP.NET Core。 您可以与各种客户端(如浏览器或移动应用程序)一起使用SignalR,确保连接的客户机实时更新。

设置您的开发环境

要开始,您需要:

构建SignalR Hub

在其核心,SignalR围绕着一个SignalR hub运转,这是客户端和服务器交互的中心点。

创建新的 ASP.NET Core 项目。 现在,添加一个新类并将其命名为ChatHub。 这将作为我们的SignalR hub。

using Microsoft.AspNetCore.SignalR;
using System.Threading.Tasks;

// Define a SignalR Hub class named ChatHub
public class ChatHub : Hub
{
    // Asynchronous method to send messages
    public async Task SendMessage(string user, string message)
    {
        // Send a message to all connected clients
        await Clients.All.SendAsync("ReceiveMessage", user, message);
    }
}
using Microsoft.AspNetCore.SignalR;
using System.Threading.Tasks;

// Define a SignalR Hub class named ChatHub
public class ChatHub : Hub
{
    // Asynchronous method to send messages
    public async Task SendMessage(string user, string message)
    {
        // Send a message to all connected clients
        await Clients.All.SendAsync("ReceiveMessage", user, message);
    }
}
Imports Microsoft.AspNetCore.SignalR
Imports System.Threading.Tasks

' Define a SignalR Hub class named ChatHub
Public Class ChatHub
	Inherits Hub

	' Asynchronous method to send messages
	Public Async Function SendMessage(ByVal user As String, ByVal message As String) As Task
		' Send a message to all connected clients
		Await Clients.All.SendAsync("ReceiveMessage", user, message)
	End Function
End Class
$vbLabelText   $csharpLabel

Startup类中,让我们集成我们的hub。

public class Startup
{
    // Configure services and add SignalR
    public void ConfigureServices(IServiceCollection services)
    {
        services.AddSignalR(); // Add SignalR services
    }

    // Configure the app to use SignalR and map the hub
    public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
    {
        // Setup endpoint to route to ChatHub
        app.UseEndpoints(endpoints =>
        {
            endpoints.MapHub<ChatHub>("/chatHub");
        });
    }
}
public class Startup
{
    // Configure services and add SignalR
    public void ConfigureServices(IServiceCollection services)
    {
        services.AddSignalR(); // Add SignalR services
    }

    // Configure the app to use SignalR and map the hub
    public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
    {
        // Setup endpoint to route to ChatHub
        app.UseEndpoints(endpoints =>
        {
            endpoints.MapHub<ChatHub>("/chatHub");
        });
    }
}
Public Class Startup
	' Configure services and add SignalR
	Public Sub ConfigureServices(ByVal services As IServiceCollection)
		services.AddSignalR() ' Add SignalR services
	End Sub

	' Configure the app to use SignalR and map the hub
	Public Sub Configure(ByVal app As IApplicationBuilder, ByVal env As IWebHostEnvironment)
		' Setup endpoint to route to ChatHub
		app.UseEndpoints(Sub(endpoints)
			endpoints.MapHub(Of ChatHub)("/chatHub")
		End Sub)
	End Sub
End Class
$vbLabelText   $csharpLabel

客户端实现

SignalR功能多样化。虽然本教程重点是ASP.NET Core和JavaScript客户端库,但SignalR支持从.NET到Java的各种客户端。

使用SignalR客户端库

SignalR客户端库让您的客户端代码可以直接与服务器端连接和通信。对于我们的示例,使用JavaScript。

首先,添加SignalR JavaScript客户端库:

<script src="https://cdn.jsdelivr.net/npm/@microsoft/signalr@3.1.8/dist/browser/signalr.js"></script>
<script src="https://cdn.jsdelivr.net/npm/@microsoft/signalr@3.1.8/dist/browser/signalr.js"></script>
HTML

现在,您可以连接到hub:

// Create a connection to the SignalR hub
const connection = new signalR.HubConnectionBuilder()
    .withUrl("/chatHub") // The hub URL
    .build();

// Start the connection
connection.start().catch(err => console.error(err.toString()));

// Setup a listener for receiving messages
connection.on("ReceiveMessage", (user, message) => {
    console.log(`${user} says: ${message}`);
});
// Create a connection to the SignalR hub
const connection = new signalR.HubConnectionBuilder()
    .withUrl("/chatHub") // The hub URL
    .build();

// Start the connection
connection.start().catch(err => console.error(err.toString()));

// Setup a listener for receiving messages
connection.on("ReceiveMessage", (user, message) => {
    console.log(`${user} says: ${message}`);
});
JAVASCRIPT

这个简单的客户端代码连接到hub并监听任何广播的消息。

实时功能的实际运用

发送消息

使用我们之前的客户端和服务器端代码片段,发送消息很简单。 服务器和客户端都可以发起通信。

从服务器端:

// Send a message from the server to all connected clients
await Clients.All.SendAsync("ReceiveMessage", "Server", "Hello from server!");
// Send a message from the server to all connected clients
await Clients.All.SendAsync("ReceiveMessage", "Server", "Hello from server!");
' Send a message from the server to all connected clients
Await Clients.All.SendAsync("ReceiveMessage", "Server", "Hello from server!")
$vbLabelText   $csharpLabel

从客户端:

// Send a message from the client to the server
connection.send("SendMessage", "Client", "Hello from client!")
    .catch(err => console.error(err.toString()));
// Send a message from the client to the server
connection.send("SendMessage", "Client", "Hello from client!")
    .catch(err => console.error(err.toString()));
JAVASCRIPT

高级实时通信

ASP.NET Core SignalR提供高级实时通信功能:

  1. 连接分组:将连接的客户机细分为组,向特定段广播消息。
  2. 处理断开连接:自动管理客户机连接和断开连接。
  3. 二进制协议:虽然SignalR默认使用基于文本的协议,但它也支持二进制协议。

SignalR与Azure SignalR服务

为了实现可扩展的实时功能,集成Azure SignalR服务。 这个完全托管的服务支持大量同时连接,适合高需求应用程序。

集成Azure SignalR服务:

  1. 安装Azure SignalR SDK
  2. 使用Azure Service Bus进行后台平面支持。
  3. 调整Startup类以使用Azure SignalR。
public class Startup
{
    public void ConfigureServices(IServiceCollection services)
    {
        // Add Azure SignalR services
        services.AddSignalR().AddAzureSignalR();
    }

    public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
    {
        // Use Azure SignalR and map hub with routes
        app.UseAzureSignalR(routes =>
        {
            routes.MapHub<ChatHub>("/chatHub");
        });
    }
}
public class Startup
{
    public void ConfigureServices(IServiceCollection services)
    {
        // Add Azure SignalR services
        services.AddSignalR().AddAzureSignalR();
    }

    public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
    {
        // Use Azure SignalR and map hub with routes
        app.UseAzureSignalR(routes =>
        {
            routes.MapHub<ChatHub>("/chatHub");
        });
    }
}
Public Class Startup
	Public Sub ConfigureServices(ByVal services As IServiceCollection)
		' Add Azure SignalR services
		services.AddSignalR().AddAzureSignalR()
	End Sub

	Public Sub Configure(ByVal app As IApplicationBuilder, ByVal env As IWebHostEnvironment)
		' Use Azure SignalR and map hub with routes
		app.UseAzureSignalR(Sub(routes)
			routes.MapHub(Of ChatHub)("/chatHub")
		End Sub)
	End Sub
End Class
$vbLabelText   $csharpLabel

Iron Suite通过高级.NET工具增强SignalR

虽然ASP.NET Core SignalR为实时网络功能提供了卓越的基础,但开发人员通常希望使用工具来增强整体体验和功能。 这就是Iron Software套件库的作用。

Iron Suite是一套高级.NET库,旨在增强您的ASP.NET Core应用程序,包括那些使用SignalR的应用程序。 此套件中的每个产品都提供独特的功能,确保更丰富的应用体验。 让我们深入探讨这些产品:

IronPDF。

Signalr C#(开发人员工作方式)图1

了解更多关于IronPDF的功能,可让您在.NET应用程序中生成、编辑和读取PDF文件。 想象一下,在一个团队实时协作文档的场景中集成SignalR。当发生更改时,文档可以实时转换为PDF,并将更新无缝推送到所有连接的客户端。 SignalR的实时功能与IronPDF的功能相结合,可以彻底改变协作工具。

IronPDF将HTML、URL和完整网页转换为原始水平的精美PDF。 这非常适合保存在线报告、发票或您想保留的任何基于网页的信息。您是否想将HTML转换为PDF? 立即试用IronPDF!

using IronPdf;

class Program
{
    static void Main(string[] args)
    {
        var renderer = new ChromePdfRenderer();

        // 1. Convert HTML String to PDF
        var htmlContent = "<h1>Hello, IronPDF!</h1><p>This is a PDF from an HTML string.</p>";
        var pdfFromHtmlString = renderer.RenderHtmlAsPdf(htmlContent);
        pdfFromHtmlString.SaveAs("HTMLStringToPDF.pdf");

        // 2. Convert HTML File to PDF
        var htmlFilePath = "path_to_your_html_file.html"; // Specify the path to your HTML file
        var pdfFromHtmlFile = renderer.RenderHtmlFileAsPdf(htmlFilePath);
        pdfFromHtmlFile.SaveAs("HTMLFileToPDF.pdf");

        // 3. Convert URL to PDF
        var url = "http://ironpdf.com"; // Specify the URL
        var pdfFromUrl = renderer.RenderUrlAsPdf(url);
        pdfFromUrl.SaveAs("URLToPDF.pdf");
    }
}
using IronPdf;

class Program
{
    static void Main(string[] args)
    {
        var renderer = new ChromePdfRenderer();

        // 1. Convert HTML String to PDF
        var htmlContent = "<h1>Hello, IronPDF!</h1><p>This is a PDF from an HTML string.</p>";
        var pdfFromHtmlString = renderer.RenderHtmlAsPdf(htmlContent);
        pdfFromHtmlString.SaveAs("HTMLStringToPDF.pdf");

        // 2. Convert HTML File to PDF
        var htmlFilePath = "path_to_your_html_file.html"; // Specify the path to your HTML file
        var pdfFromHtmlFile = renderer.RenderHtmlFileAsPdf(htmlFilePath);
        pdfFromHtmlFile.SaveAs("HTMLFileToPDF.pdf");

        // 3. Convert URL to PDF
        var url = "http://ironpdf.com"; // Specify the URL
        var pdfFromUrl = renderer.RenderUrlAsPdf(url);
        pdfFromUrl.SaveAs("URLToPDF.pdf");
    }
}
Imports IronPdf

Friend Class Program
	Shared Sub Main(ByVal args() As String)
		Dim renderer = New ChromePdfRenderer()

		' 1. Convert HTML String to PDF
		Dim htmlContent = "<h1>Hello, IronPDF!</h1><p>This is a PDF from an HTML string.</p>"
		Dim pdfFromHtmlString = renderer.RenderHtmlAsPdf(htmlContent)
		pdfFromHtmlString.SaveAs("HTMLStringToPDF.pdf")

		' 2. Convert HTML File to PDF
		Dim htmlFilePath = "path_to_your_html_file.html" ' Specify the path to your HTML file
		Dim pdfFromHtmlFile = renderer.RenderHtmlFileAsPdf(htmlFilePath)
		pdfFromHtmlFile.SaveAs("HTMLFileToPDF.pdf")

		' 3. Convert URL to PDF
		Dim url = "http://ironpdf.com" ' Specify the URL
		Dim pdfFromUrl = renderer.RenderUrlAsPdf(url)
		pdfFromUrl.SaveAs("URLToPDF.pdf")
	End Sub
End Class
$vbLabelText   $csharpLabel

了解更多关于 IronXL 是一个 Excel 库,可帮助处理 Excel 文件而无需安装 Excel。

Signalr C#(开发人员工作方式)图2

谈到处理Excel电子表格时,探索IronXL功能是一个佼佼者。 在商业环境中,电子表格扮演着重要角色。 将SignalR与IronXL结合意味着财务团队能够实时处理预算表,目睹变化的发生。 想象一个场景,来自不同部门的数据条目流入一个集中的Excel表格,所有利益相关者都可以实时更新。 实时通信和动态电子表格管理的结合成为现实。

光学字符识别 (OCR) 是一种将不同类型的文档转换为可编辑和可搜索数据的技术。

Signalr C#(开发人员工作方式)图3

光学字符识别(OCR)已成为现代应用程序的核心。 观看IronOCR的演示让.NET开发人员能够从图像和文档中提取文本。 结合SignalR的实时功能可以改变游戏规则。 考虑一个平台,用户上传包含文本数据的图像。 SignalR可以用于在IronOCR处理图像后实时通知用户,使得数据提取变得互动且即时。

开始使用 IronBarcode 是一个专为 .NET 框架设计的条码读取和写入库。

Signalr C#(开发人员工作方式)图4

条形码在库存管理、票务系统等中不可或缺。 发现IronBarcode功能简化了条形码的创建和读取。 现在,想象在仓库管理系统中与SignalR集成。 当物品被扫描时,库存实时更新,通知连接的客户机库存水平,确保顺畅的物流操作。

结论

Signalr C#(开发人员工作方式)图5

ASP.NET Core SignalR与Iron Suite强大工具的结合为开发人员和最终用户提供了一种提升的体验。 实时网络功能不仅仅是关于通信,而是当与像Iron Suite这样恰当的资源结合时,可以重新定义互动应用程序的变革性工具。

值得注意的是Iron Suite提供的价值主张。每个产品许可证起价为$799,为开发人员提供了一整套高级功能。 然而,如果您不确定是否立即购买,每个产品都慷慨地提供了Iron Software产品的免费试用。 这使您可以在做出决定之前试驾这些功能。

此外,如果您考虑整合多个工具,绝佳消息是您可以购买整个Iron Suite以获得更多价值,价格只相当于两个产品! 这不仅确保您获得最大的收益,还为您提供一个全面的工具包,以革新您的ASP.NET Core SignalR应用程序。

常见问题解答

什么是 SignalR,它如何增强 Web 应用程序?

SignalR 是 ASP.NET Core 中的一个库,它为应用程序添加了实时 Web 功能,实现即时的服务器-客户端通信。通过允许实时更新和反馈,这使得 Web 应用程序互动且响应迅速。

如何在我的 C# 应用程序中设置 SignalR?

要在 C# 应用程序中设置 SignalR,需要安装 ASP.NET Core SDK 并使用 Visual Studio 进行开发。在 Startup 类中添加 SignalR 服务并将 hubs 映射到端点以建立服务器-客户端通信。

SignalR Hub 在实时通信中起到什么作用?

SignalR Hub 作为一个中心组件,促进服务器与已连接客户端之间的通信。它实现了实时消息的发送和接收,是 SignalR 功能的关键部分。

如何在 SignalR 中处理实时消息传递?

可以通过创建服务器端 hub 和客户端脚本来管理 SignalR 中的实时消息传递。客户端 JavaScript 建立与 hub 的连接,并使用 connection.onconnection.send 之类的方法处理消息的发送和接收。

SignalR 的一些高级功能有哪些?

SignalR 提供了高级功能,如分组连接以分段通信、优雅处理客户端断开连接,以及支持二进制协议以增强实时通信能力。

Azure SignalR 服务如何帮助扩展应用程序?

Azure SignalR 服务通过支持大量并发连接帮助应用程序扩展。它涉及安装 Azure SignalR SDK,并配置 Startup 类以利用 Azure 的基础架构实现可扩展的实时通信。

如何在 SignalR 应用程序中使用 IronPDF 生成 PDF?

在 SignalR 应用程序中可以通过转换 HTML 内容来使用 IronPDF 生成 PDF 文档。IronPDF 的 RenderHtmlAsPdf 方法允许无缝的 PDF 生成,可以与 SignalR 中的实时更新集成。

IronXL 给 SignalR 应用程序带来了什么好处?

IronXL 增强了 SignalR 应用程序的 Excel 文件处理能力。它允许您在应用程序中创建、读取和修改 Excel 文档,并在实时功能之外提供附加的数据处理能力。

IronOCR 可以集成到 SignalR 应用程序中进行文本识别吗?

是的,IronOCR 可以集成到 SignalR 应用程序中进行光学字符识别(OCR)。这允许从图像中实时提取文本,为应用程序提供动态文本识别能力。

在 SignalR 应用程序中使用 IronBarcode 的潜力是什么?

IronBarcode 可以在 SignalR 应用程序中生成和读取条形码。这项功能对于需要动态条形码处理和实时数据处理的应用程序非常有用。

Curtis Chau
技术作家

Curtis Chau 拥有卡尔顿大学的计算机科学学士学位,专注于前端开发,精通 Node.js、TypeScript、JavaScript 和 React。他热衷于打造直观且美观的用户界面,喜欢使用现代框架并创建结构良好、视觉吸引力强的手册。

除了开发之外,Curtis 对物联网 (IoT) 有浓厚的兴趣,探索将硬件和软件集成的新方法。在空闲时间,他喜欢玩游戏和构建 Discord 机器人,将他对技术的热爱与创造力相结合。