SignalR 填坑記


 

1.發送文字消息沒有問題,如何發送文件消息

SignalR可以將參數序列化和反序列化. 這些參數被序列化的格式叫做Hub 協議, 所以Hub協議就是一種用來序列化和反序列化的格式.

Hub協議的默認協議是JSON, 還支持另外一個協議是MessagePack. MessagePack是二進制格式的, 它比JSON更緊湊, 而且處理起來更簡單快速, 因為它是二進制的.

但我們使用的版本暫時沒有此功能,所以建議還是采用Base64傳輸。

 

2.發送文件時,如果文件過大,服務端無法接收

Signalr MessageSize默認是64K 大小,設為NULL即禁用這個限制 ,自己也可以按需求改為自己需要的大小

GlobalHost.Configuration.MaxIncomingWebSocketMessageSize = null;

 

3.如果出現內存過高,建議更改此值

GlobalHost.Configuration.DefaultMessageBufferSize = 20;

DefaultMessageBufferSize:默認情況下,SignalR 將保留在內存中的每個中心的每個連接的 1000 條消息。 如果使用大型消息時,這可能會造成內存問題,這可以通過減小此值來緩解這。 此設置可以設置Application_Start事件處理程序在 ASP.NET 應用程序,或在Configuration自承載的應用程序中的 OWIN 啟動類的方法。 下面的示例演示如何以減少應用程序,以減少使用的服務器內存量的內存占用減小此值:

 

4.Core與Net Framework間能否通信

Core版本的SignalR 不能與Net Framework版本的通信。所以客戶端和服務端 必須是支持Core版本的SignalR。

5.Core版本的SignalR 方法命名方式使用駝峰命名法

以前服務端使用大寫,客戶端使用小寫,現在在Core版本已經統一

 

ignalR技術在 ASP.NET Core 和 ASP.NET下有不同的實現,二者之間是存在差異的。所以在學習之前你應該搞懂他們之間的差異性,這有助你選擇合適的框架。

本文知識來源 ASP.NET Core官方文檔:https://docs.microsoft.com/zh-cn/aspnet/core/signalr/version-differences?view=aspnetcore-2.2

 

  ASP.NET SignalR ASP.NET Core SignalR
服務器 NuGet 包 Microsoft.AspNet.SignalR Microsoft.AspNetCore.App (.NET Core) Microsoft.AspNetCore.SignalR (.NET Framework)
客戶端 NuGet 包 Microsoft.AspNet.SignalR.Client Microsoft.AspNet.SignalR.JS Microsoft.AspNetCore.SignalR.Client
客戶端 npm 包 signalr @aspnet/signalr
服務器應用類型 ASP.NET (System.Web) 或 OWIN 自承載 ASP.NET Core
受支持的服務器平台 .NET framework 4.5 或更高版本 .NET Framework 4.6.1 或更高版本 .NET core 2.1 或更高版本

服務端的差異

1、刪除 PersistentConnection

了解ASP.NET SignalR的筆友都知道,在此版本中存在PersistentConnection(持久連接)和 Hubs(集線器),PersistentConnection 處於較底層,定義了眾多socket操作api。但是在.NET Core 中,微軟已經移除了該實現,保留了抽象度更高的Hubs。

2、GlobalHost

在ASP.NET MVC和Web Api 中如果想集成SignalR,我們會使用如下代碼獲取:

GlobalHost.ConnectionManager.GetHubContext<T>();

但是在.NET Core 中需要使用DI訪問HubContext。

3、刪除HubState

類似下面這種通過客戶端定義變量,服務端可以直接使用的方式,在.NET Core 中已不被支持。

1
2
3
4
5
// 客戶端代碼(Javascript)
hubProxy.state.UserName= "mike"
hubProxy.state.MsgId=1;
 
hubProxy.server.alert( "" );
1
2
3
4
5
6
// 服務端代碼
public  Task Alert( string  msg)
{
    Console.WriteLine( "UserName:" + Clients.Caller.UserName);
    Console.WriteLine( "MsgId:" + Clients.Caller.MsgId);
}

 

客戶端上的差異

1、Javascript客戶端的獲取方式

在以前的版本中,JavaScript 客戶端是通過 Visual Studio 中的 NuGet 包獲取的。 Core 版本的 @aspnet/signalr npm 包包含 JavaScript 庫。 此包不包括在ASP.NET Core Web 應用程序模板。 使用 npm 獲取並安裝 @aspnet/signalr npm 包。  

2、已刪除對JQuery的依賴

 

3、客戶端語法的不同

JavaScript 語法已與 Signalr 早期版本中的相應語法不同。 請使用 HubConnectionBuilder API 而非 $connection 對象創建連接。

4、中心代理

已經不再自動生成代理


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM