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、中心代理
已經不再自動生成代理