設定 ASP.NET Core SignalR 向外延展的 Redis 後擋板
由 安德魯·斯坦頓-護士、 佈雷迪·加斯特和 湯姆·戴克斯特拉。
本文說明 設定 Redis 伺服器的SignalR特定層面,以用於向外延展 ASP.NET Core SignalR 應用程式。
警告
本文說明如何使用 連接字串。 使用本機資料庫時,使用者不需要經過驗證,但在生產環境中,連接字串 有時會包含要驗證的密碼。 資源擁有者密碼認證 (ROPC) 是生產資料庫中應避免的安全性風險。 實際執行應用程式應該使用可用的最安全驗證流程。 如需部署至測試或生產環境之應用程式驗證的詳細資訊,請參閱 保護驗證流程。
設定 Redis 後擋板
部署 Redis 伺服器。
重要
若要使用生產環境,只有在 Redis 後擋板在與 SignalR 應用程式相同的資料中心執行時,才建議使用 Redis 後擋板。 否則,網路延遲會降低效能。 如果您的 SignalR 應用程式是在 Azure 雲端中執行,建議您使用 Azure SignalR Service,而不是 Redis 後擋板。
如需詳細資訊,請參閱以下資源:
在 SignalR 應用程式中,安裝下列 NuGet 套件:
Microsoft.AspNetCore.SignalR.StackExchangeRedis
在檔案中
Program.cs
呼叫 的行前面加入下列這一行,以呼叫 。AddStackExchangeRedisbuilder.Build()
builder.Services.AddSignalR().AddStackExchangeRedis("<your_Redis_connection_string>");
視需要設定選項:
大部分選項都可以在連接字串或
ConfigurationOptions
物件中設定。ConfigurationOptions
中指定的選項會覆寫連接字串中設定的選項。下列範例示範如何在
ConfigurationOptions
物件中設定選項。 此範例會新增通道前置詞,讓多個應用程式可以共用相同的 Redis 執行個體,如下列步驟所述。builder.Services.AddSignalR() .AddStackExchangeRedis(connectionString, options => { options.Configuration.ChannelPrefix = RedisChannel.Literal("MyApp"); });
在上述程式碼中,
options.Configuration
會使用連接字串中指定的任何項目初始化。如需 Redis 選項的相關資訊,請參閱 StackExchange Redis 文件。
如果您針對多個 SignalR 應用程式使用一部 Redis 伺服器,請針對每個 SignalR 應用程式使用不同的通道前置詞。
設定通道前置詞會將一個 SignalR 應用程式與使用不同通道前置詞的其他應用程式隔離。 如果您未指派不同的前置詞,從一個應用程式傳送至其所有用戶端的訊息,將會移至所有使用 Redis 伺服器作為後擋板之應用程式的所有用戶端。
為您的伺服器陣列負載平衡軟體設定黏性會話。 以下是一些文件範例,說明如何執行此動作:
Redis 伺服器錯誤
當 Redis 伺服器關閉時,SignalR 會擲回指出訊息不會傳遞的例外狀況。 一些典型的例外狀況訊息:
- 寫入訊息失敗
- 無法叫用中樞方法 'MethodName'
- 對 Redis 的連線失敗
SignalR 不會緩衝訊息,以在伺服器備份時傳送訊息。 Redis 伺服器關閉時傳送的任何訊息都遺失。
當 Redis 伺服器再次可用時,SignalR 會自動重新連線。
連線失敗的自訂行為
以下是示範如何處理 Redis 連線失敗事件的範例。
services.AddSignalR()
.AddMessagePackProtocol()
.AddStackExchangeRedis(o =>
{
o.ConnectionFactory = async writer =>
{
var config = new ConfigurationOptions
{
AbortOnConnectFail = false
};
config.EndPoints.Add(IPAddress.Loopback, 0);
config.SetDefaultPorts();
var connection = await ConnectionMultiplexer.ConnectAsync(config, writer);
connection.ConnectionFailed += (_, e) =>
{
Console.WriteLine("Connection to Redis failed.");
};
if (!connection.IsConnected)
{
Console.WriteLine("Did not connect to Redis.");
}
return connection;
};
});
Redis 叢集
Redis 叢集會利用多個同時作用中的 Redis 伺服器來達到高可用性。 當 Redis 叢集做為 SignalR 的後擋板時,訊息會傳遞至叢集的所有節點,而不需要修改應用程式的程式碼。
叢集中的節點數目與後擋板的輸送量之間有取捨。 增加節點數目會增加叢集的可用性,但會減少輸送量,因為訊息必須傳輸至叢集中的所有節點。
在 SignalR 應用程式中,使用下列其中一種方法包含所有可能的 Redis 節點:
- 列出以逗號分隔之連接字串中的節點。
- 如果使用自訂行為進行連線失敗,請將節點新增至
ConfigurationOptions.Endpoints
。
下一步
如需詳細資訊,請參閱以下資源:
本文說明 設定 Redis 伺服器的SignalR特定層面,以用於向外延展 ASP.NET Core SignalR 應用程式。
警告
本文說明如何使用 連接字串。 使用本機資料庫時,使用者不需要經過驗證,但在生產環境中,連接字串 有時會包含要驗證的密碼。 資源擁有者密碼認證 (ROPC) 是生產資料庫中應避免的安全性風險。 實際執行應用程式應該使用可用的最安全驗證流程。 如需部署至測試或生產環境之應用程式驗證的詳細資訊,請參閱 保護驗證流程。
設定 Redis 後擋板
部署 Redis 伺服器。
重要
若要使用生產環境,只有在 Redis 後擋板在與 SignalR 應用程式相同的資料中心執行時,才建議使用 Redis 後擋板。 否則,網路延遲會降低效能。 如果您的 SignalR 應用程式是在 Azure 雲端中執行,建議您使用 Azure SignalR Service,而不是 Redis 後擋板。
如需詳細資訊,請參閱以下資源:
在 SignalR 應用程式中,安裝下列 NuGet 套件:
Microsoft.AspNetCore.SignalR.StackExchangeRedis
在檔案中
Program.cs
呼叫 的行前面加入下列這一行,以呼叫 。AddStackExchangeRedisbuilder.Build()
builder.Services.AddSignalR().AddStackExchangeRedis("<your_Redis_connection_string>");
視需要設定選項:
大部分選項都可以在連接字串或
ConfigurationOptions
物件中設定。ConfigurationOptions
中指定的選項會覆寫連接字串中設定的選項。下列範例示範如何在
ConfigurationOptions
物件中設定選項。 此範例會新增通道前置詞,讓多個應用程式可以共用相同的 Redis 執行個體,如下列步驟所述。services.AddSignalR() .AddStackExchangeRedis(connectionString, options => { options.Configuration.ChannelPrefix = "MyApp"; });
在上述程式碼中,
options.Configuration
會使用連接字串中指定的任何項目初始化。如需 Redis 選項的相關資訊,請參閱 StackExchange Redis 文件。
如果您針對多個 SignalR 應用程式使用一部 Redis 伺服器,請針對每個 SignalR 應用程式使用不同的通道前置詞。
設定通道前置詞會將一個 SignalR 應用程式與使用不同通道前置詞的其他應用程式隔離。 如果您未指派不同的前置詞,從一個應用程式傳送至其所有用戶端的訊息,將會移至所有使用 Redis 伺服器作為後擋板之應用程式的所有用戶端。
為您的伺服器陣列負載平衡軟體設定黏性會話。 以下是一些文件範例,說明如何執行此動作:
Redis 伺服器錯誤
當 Redis 伺服器關閉時,SignalR 會擲回指出訊息不會傳遞的例外狀況。 一些典型的例外狀況訊息:
- 寫入訊息失敗
- 無法叫用中樞方法 'MethodName'
- 對 Redis 的連線失敗
SignalR 不會緩衝訊息,以在伺服器備份時傳送訊息。 Redis 伺服器關閉時傳送的任何訊息都遺失。
當 Redis 伺服器再次可用時,SignalR 會自動重新連線。
連線失敗的自訂行為
以下是示範如何處理 Redis 連線失敗事件的範例。
services.AddSignalR()
.AddMessagePackProtocol()
.AddStackExchangeRedis(o =>
{
o.ConnectionFactory = async writer =>
{
var config = new ConfigurationOptions
{
AbortOnConnectFail = false
};
config.EndPoints.Add(IPAddress.Loopback, 0);
config.SetDefaultPorts();
var connection = await ConnectionMultiplexer.ConnectAsync(config, writer);
connection.ConnectionFailed += (_, e) =>
{
Console.WriteLine("Connection to Redis failed.");
};
if (!connection.IsConnected)
{
Console.WriteLine("Did not connect to Redis.");
}
return connection;
};
});
Redis 叢集
Redis 叢集會利用多個同時作用中的 Redis 伺服器來達到高可用性。 當 Redis 叢集做為 SignalR 的後擋板時,訊息會傳遞至叢集的所有節點,而不需要修改應用程式的程式碼。
叢集中的節點數目與後擋板的輸送量之間有取捨。 增加節點數目會增加叢集的可用性,但會減少輸送量,因為訊息必須傳輸至叢集中的所有節點。
在 SignalR 應用程式中,使用下列其中一種方法包含所有可能的 Redis 節點:
- 列出以逗號分隔之連接字串中的節點。
- 如果使用自訂行為進行連線失敗,請將節點新增至
ConfigurationOptions.Endpoints
。
下一步
如需詳細資訊,請參閱以下資源:
本文說明 設定 Redis 伺服器的SignalR特定層面,以用於向外延展 ASP.NET Core SignalR 應用程式。
警告
本文說明如何使用 連接字串。 使用本機資料庫時,使用者不需要經過驗證,但在生產環境中,連接字串 有時會包含要驗證的密碼。 資源擁有者密碼認證 (ROPC) 是生產資料庫中應避免的安全性風險。 實際執行應用程式應該使用可用的最安全驗證流程。 如需部署至測試或生產環境之應用程式驗證的詳細資訊,請參閱 保護驗證流程。
設定 Redis 後擋板
部署 Redis 伺服器。
重要
若要使用生產環境,只有在 Redis 後擋板在與 SignalR 應用程式相同的資料中心執行時,才建議使用 Redis 後擋板。 否則,網路延遲會降低效能。 如果您的 SignalR 應用程式是在 Azure 雲端中執行,建議您使用 Azure SignalR Service,而不是 Redis 後擋板。
如需詳細資訊,請參閱以下資源:
在 SignalR 應用程式中,安裝下列 NuGet 套件:
Microsoft.AspNetCore.SignalR.StackExchangeRedis
在檔案中
Program.cs
呼叫 的行前面加入下列這一行,以呼叫 。AddStackExchangeRedisbuilder.Build()
builder.Services.AddSignalR().AddStackExchangeRedis("<your_Redis_connection_string>");
視需要設定選項:
大部分選項都可以在連接字串或
ConfigurationOptions
物件中設定。ConfigurationOptions
中指定的選項會覆寫連接字串中設定的選項。下列範例示範如何在
ConfigurationOptions
物件中設定選項。 此範例會新增通道前置詞,讓多個應用程式可以共用相同的 Redis 執行個體,如下列步驟所述。builder.Services.AddSignalR() .AddStackExchangeRedis(connectionString, options => { options.Configuration.ChannelPrefix = RedisChannel.Literal("MyApp"); });
在上述程式碼中,
options.Configuration
會使用連接字串中指定的任何項目初始化。如需 Redis 選項的相關資訊,請參閱 StackExchange Redis 文件。
如果您針對多個 SignalR 應用程式使用一部 Redis 伺服器,請針對每個 SignalR 應用程式使用不同的通道前置詞。
設定通道前置詞會將一個 SignalR 應用程式與使用不同通道前置詞的其他應用程式隔離。 如果您未指派不同的前置詞,從一個應用程式傳送至其所有用戶端的訊息,將會移至所有使用 Redis 伺服器作為後擋板之應用程式的所有用戶端。
為您的伺服器陣列負載平衡軟體設定黏性會話。 以下是一些文件範例,說明如何執行此動作:
Redis 伺服器錯誤
當 Redis 伺服器關閉時,SignalR 會擲回指出訊息不會傳遞的例外狀況。 一些典型的例外狀況訊息:
- 寫入訊息失敗
- 無法叫用中樞方法 'MethodName'
- 對 Redis 的連線失敗
SignalR 不會緩衝訊息,以在伺服器備份時傳送訊息。 Redis 伺服器關閉時傳送的任何訊息都遺失。
當 Redis 伺服器再次可用時,SignalR 會自動重新連線。
連線失敗的自訂行為
以下是示範如何處理 Redis 連線失敗事件的範例。
services.AddSignalR()
.AddMessagePackProtocol()
.AddStackExchangeRedis(o =>
{
o.ConnectionFactory = async writer =>
{
var config = new ConfigurationOptions
{
AbortOnConnectFail = false
};
config.EndPoints.Add(IPAddress.Loopback, 0);
config.SetDefaultPorts();
var connection = await ConnectionMultiplexer.ConnectAsync(config, writer);
connection.ConnectionFailed += (_, e) =>
{
Console.WriteLine("Connection to Redis failed.");
};
if (!connection.IsConnected)
{
Console.WriteLine("Did not connect to Redis.");
}
return connection;
};
});
Redis 叢集
Redis 叢集會利用多個同時作用中的 Redis 伺服器來達到高可用性。 當 Redis 叢集做為 SignalR 的後擋板時,訊息會傳遞至叢集的所有節點,而不需要修改應用程式的程式碼。
叢集中的節點數目與後擋板的輸送量之間有取捨。 增加節點數目會增加叢集的可用性,但會減少輸送量,因為訊息必須傳輸至叢集中的所有節點。
在 SignalR 應用程式中,使用下列其中一種方法包含所有可能的 Redis 節點:
- 列出以逗號分隔之連接字串中的節點。
- 如果使用自訂行為進行連線失敗,請將節點新增至
ConfigurationOptions.Endpoints
。
下一步
如需詳細資訊,請參閱以下資源:
本文說明 設定 Redis 伺服器的SignalR特定層面,以用於向外延展 ASP.NET Core SignalR 應用程式。
警告
本文說明如何使用 連接字串。 使用本機資料庫時,使用者不需要經過驗證,但在生產環境中,連接字串 有時會包含要驗證的密碼。 資源擁有者密碼認證 (ROPC) 是生產資料庫中應避免的安全性風險。 實際執行應用程式應該使用可用的最安全驗證流程。 如需部署至測試或生產環境之應用程式驗證的詳細資訊,請參閱 保護驗證流程。
設定 Redis 後擋板
部署 Redis 伺服器。
重要
若要使用生產環境,只有在 Redis 後擋板在與 SignalR 應用程式相同的資料中心執行時,才建議使用 Redis 後擋板。 否則,網路延遲會降低效能。 如果您的 SignalR 應用程式是在 Azure 雲端中執行,建議您使用 Azure SignalR Service,而不是 Redis 後擋板。
如需詳細資訊,請參閱以下資源:
在 SignalR 應用程式中,安裝下列 NuGet 套件:
Microsoft.AspNetCore.SignalR.StackExchangeRedis
在
Startup.ConfigureServices
方法中,呼叫 AddStackExchangeRedis:services.AddSignalR().AddStackExchangeRedis("<your_Redis_connection_string>");
視需要設定選項:
大部分選項都可以在連接字串或
ConfigurationOptions
物件中設定。ConfigurationOptions
中指定的選項會覆寫連接字串中設定的選項。下列範例示範如何在
ConfigurationOptions
物件中設定選項。 此範例會新增通道前置詞,讓多個應用程式可以共用相同的 Redis 執行個體,如下列步驟所述。services.AddSignalR() .AddStackExchangeRedis(connectionString, options => { options.Configuration.ChannelPrefix = "MyApp"; });
在上述程式碼中,
options.Configuration
會使用連接字串中指定的任何項目初始化。如需 Redis 選項的相關資訊,請參閱 StackExchange Redis 文件。
如果您針對多個 SignalR 應用程式使用一部 Redis 伺服器,請針對每個 SignalR 應用程式使用不同的通道前置詞。
設定通道前置詞會將一個 SignalR 應用程式與使用不同通道前置詞的其他應用程式隔離。 如果您未指派不同的前置詞,從一個應用程式傳送至其所有用戶端的訊息,將會移至所有使用 Redis 伺服器作為後擋板之應用程式的所有用戶端。
為您的伺服器陣列負載平衡軟體設定黏性會話。 以下是一些文件範例,說明如何執行此動作:
Redis 伺服器錯誤
當 Redis 伺服器關閉時,SignalR 會擲回指出訊息不會傳遞的例外狀況。 一些典型的例外狀況訊息:
- 寫入訊息失敗
- 無法叫用中樞方法 'MethodName'
- 對 Redis 的連線失敗
SignalR 不會緩衝訊息,以在伺服器備份時傳送訊息。 Redis 伺服器關閉時傳送的任何訊息都遺失。
當 Redis 伺服器再次可用時,SignalR 會自動重新連線。
連線失敗的自訂行為
以下是示範如何處理 Redis 連線失敗事件的範例。
services.AddSignalR()
.AddMessagePackProtocol()
.AddStackExchangeRedis(o =>
{
o.ConnectionFactory = async writer =>
{
var config = new ConfigurationOptions
{
AbortOnConnectFail = false
};
config.EndPoints.Add(IPAddress.Loopback, 0);
config.SetDefaultPorts();
var connection = await ConnectionMultiplexer.ConnectAsync(config, writer);
connection.ConnectionFailed += (_, e) =>
{
Console.WriteLine("Connection to Redis failed.");
};
if (!connection.IsConnected)
{
Console.WriteLine("Did not connect to Redis.");
}
return connection;
};
});
Redis 叢集
Redis 叢集會利用多個同時作用中的 Redis 伺服器來達到高可用性。 當 Redis 叢集做為 SignalR 的後擋板時,訊息會傳遞至叢集的所有節點,而不需要修改應用程式的程式碼。
叢集中的節點數目與後擋板的輸送量之間有取捨。 增加節點數目會增加叢集的可用性,但會減少輸送量,因為訊息必須傳輸至叢集中的所有節點。
在 SignalR 應用程式中,使用下列其中一種方法包含所有可能的 Redis 節點:
- 列出以逗號分隔之連接字串中的節點。
- 如果使用自訂行為進行連線失敗,請將節點新增至
ConfigurationOptions.Endpoints
。
下一步
如需詳細資訊,請參閱以下資源:
本文說明 設定 Redis 伺服器的SignalR特定層面,以用於向外延展 ASP.NET Core SignalR 應用程式。
警告
本文說明如何使用 連接字串。 使用本機資料庫時,使用者不需要經過驗證,但在生產環境中,連接字串 有時會包含要驗證的密碼。 資源擁有者密碼認證 (ROPC) 是生產資料庫中應避免的安全性風險。 實際執行應用程式應該使用可用的最安全驗證流程。 如需部署至測試或生產環境之應用程式驗證的詳細資訊,請參閱 保護驗證流程。
設定 Redis 後擋板
部署 Redis 伺服器。
重要
若要使用生產環境,只有在 Redis 後擋板在與 SignalR 應用程式相同的資料中心執行時,才建議使用 Redis 後擋板。 否則,網路延遲會降低效能。 如果您的 SignalR 應用程式是在 Azure 雲端中執行,建議您使用 Azure SignalR Service,而不是 Redis 後擋板。
如需詳細資訊,請參閱以下資源:
在 SignalR 應用程式中,安裝下列 NuGet 套件:
Microsoft.AspNetCore.SignalR.StackExchangeRedis
在
Startup.ConfigureServices
方法中,呼叫 AddStackExchangeRedis:services.AddSignalR().AddStackExchangeRedis("<your_Redis_connection_string>");
視需要設定選項:
大部分選項都可以在連接字串或
ConfigurationOptions
物件中設定。ConfigurationOptions
中指定的選項會覆寫連接字串中設定的選項。下列範例示範如何在
ConfigurationOptions
物件中設定選項。 此範例會新增通道前置詞,讓多個應用程式可以共用相同的 Redis 執行個體,如下列步驟所述。services.AddSignalR() .AddStackExchangeRedis(connectionString, options => { options.Configuration.ChannelPrefix = "MyApp"; });
在上述程式碼中,
options.Configuration
會使用連接字串中指定的任何項目初始化。如需 Redis 選項的相關資訊,請參閱 StackExchange Redis 文件。
如果您針對多個 SignalR 應用程式使用一部 Redis 伺服器,請針對每個 SignalR 應用程式使用不同的通道前置詞。
設定通道前置詞會將一個 SignalR 應用程式與使用不同通道前置詞的其他應用程式隔離。 如果您未指派不同的前置詞,從一個應用程式傳送至其所有用戶端的訊息,將會移至所有使用 Redis 伺服器作為後擋板之應用程式的所有用戶端。
為您的伺服器陣列負載平衡軟體設定黏性會話。 以下是一些文件範例,說明如何執行此動作:
Redis 伺服器錯誤
當 Redis 伺服器關閉時,SignalR 會擲回指出訊息不會傳遞的例外狀況。 一些典型的例外狀況訊息:
- 寫入訊息失敗
- 無法叫用中樞方法 'MethodName'
- 對 Redis 的連線失敗
SignalR 不會緩衝訊息,以在伺服器備份時傳送訊息。 Redis 伺服器關閉時傳送的任何訊息都遺失。
當 Redis 伺服器再次可用時,SignalR 會自動重新連線。
連線失敗的自訂行為
以下是示範如何處理 Redis 連線失敗事件的範例。
services.AddSignalR()
.AddMessagePackProtocol()
.AddStackExchangeRedis(o =>
{
o.ConnectionFactory = async writer =>
{
var config = new ConfigurationOptions
{
AbortOnConnectFail = false
};
config.EndPoints.Add(IPAddress.Loopback, 0);
config.SetDefaultPorts();
var connection = await ConnectionMultiplexer.ConnectAsync(config, writer);
connection.ConnectionFailed += (_, e) =>
{
Console.WriteLine("Connection to Redis failed.");
};
if (!connection.IsConnected)
{
Console.WriteLine("Did not connect to Redis.");
}
return connection;
};
});
Redis 叢集
Redis 叢集會利用多個同時作用中的 Redis 伺服器來達到高可用性。 當 Redis 叢集做為 SignalR 的後擋板時,訊息會傳遞至叢集的所有節點,而不需要修改應用程式的程式碼。
叢集中的節點數目與後擋板的輸送量之間有取捨。 增加節點數目會增加叢集的可用性,但會減少輸送量,因為訊息必須傳輸至叢集中的所有節點。
在 SignalR 應用程式中,使用下列其中一種方法包含所有可能的 Redis 節點:
- 列出以逗號分隔之連接字串中的節點。
- 如果使用自訂行為進行連線失敗,請將節點新增至
ConfigurationOptions.Endpoints
。
下一步
如需詳細資訊,請參閱以下資源:
本文說明 設定 Redis 伺服器的SignalR特定層面,以用於向外延展 ASP.NET Core SignalR 應用程式。
警告
本文說明如何使用 連接字串。 使用本機資料庫時,使用者不需要經過驗證,但在生產環境中,連接字串 有時會包含要驗證的密碼。 資源擁有者密碼認證 (ROPC) 是生產資料庫中應避免的安全性風險。 實際執行應用程式應該使用可用的最安全驗證流程。 如需部署至測試或生產環境之應用程式驗證的詳細資訊,請參閱 保護驗證流程。
設定 Redis 後擋板
部署 Redis 伺服器。
重要
若要使用生產環境,只有在 Redis 後擋板在與 SignalR 應用程式相同的資料中心執行時,才建議使用 Redis 後擋板。 否則,網路延遲會降低效能。 如果您的 SignalR 應用程式是在 Azure 雲端中執行,建議您使用 Azure SignalR Service,而不是 Redis 後擋板。
如需詳細資訊,請參閱以下資源:
在 SignalR 應用程式中,安裝下列其中一個 NuGet 套件:
Microsoft.AspNetCore.SignalR.StackExchangeRedis
- 相依於 StackExchange.Redis 2.X.X。這是 ASP.NET Core 2.2 和更新版本的建議套件。Microsoft.AspNetCore.SignalR.Redis
- 取決於 StackExchange.Redis 1.X.X。此套件不包含在 Core 3.0 和更新版本中 ASP.NET。
在
Startup.ConfigureServices
方法中,呼叫 AddStackExchangeRedis:services.AddSignalR().AddStackExchangeRedis("<your_Redis_connection_string>");
使用 Microsoft.AspNetCore.SignalR.Redis
時,呼叫 AddRedis。
視需要設定選項:
大部分選項都可以在連接字串或 ConfigurationOptions 物件中設定。
ConfigurationOptions
中指定的選項會覆寫連接字串中設定的選項。下列範例示範如何在
ConfigurationOptions
物件中設定選項。 此範例會新增通道前置詞,讓多個應用程式可以共用相同的 Redis 執行個體,如下列步驟所述。services.AddSignalR() .AddStackExchangeRedis(connectionString, options => { options.Configuration.ChannelPrefix = "MyApp"; });
使用 Microsoft.AspNetCore.SignalR.Redis
時,呼叫 AddRedis。
在上述程式碼中,options.Configuration
會使用連接字串中指定的任何項目初始化。
如需 Redis 選項的相關資訊,請參閱 StackExchange Redis 文件。
如果您針對多個 SignalR 應用程式使用一部 Redis 伺服器,請針對每個 SignalR 應用程式使用不同的通道前置詞。
設定通道前置詞會將一個 SignalR 應用程式與使用不同通道前置詞的其他應用程式隔離。 如果您未指派不同的前置詞,從一個應用程式傳送至其所有用戶端的訊息,將會移至所有使用 Redis 伺服器作為後擋板之應用程式的所有用戶端。
為您的伺服器陣列負載平衡軟體設定黏性會話。 以下是一些文件範例,說明如何執行此動作:
Redis 伺服器錯誤
當 Redis 伺服器關閉時,SignalR 會擲回指出訊息不會傳遞的例外狀況。 一些典型的例外狀況訊息:
- 寫入訊息失敗
- 無法叫用中樞方法 'MethodName'
- 對 Redis 的連線失敗
SignalR 不會緩衝訊息,以在伺服器備份時傳送訊息。 Redis 伺服器關閉時傳送的任何訊息都遺失。
當 Redis 伺服器再次可用時,SignalR 會自動重新連線。
連線失敗的自訂行為
以下是示範如何處理 Redis 連線失敗事件的範例。
services.AddSignalR()
.AddMessagePackProtocol()
.AddStackExchangeRedis(o =>
{
o.ConnectionFactory = async writer =>
{
var config = new ConfigurationOptions
{
AbortOnConnectFail = false
};
config.EndPoints.Add(IPAddress.Loopback, 0);
config.SetDefaultPorts();
var connection = await ConnectionMultiplexer.ConnectAsync(config, writer);
connection.ConnectionFailed += (_, e) =>
{
Console.WriteLine("Connection to Redis failed.");
};
if (!connection.IsConnected)
{
Console.WriteLine("Did not connect to Redis.");
}
return connection;
};
});
Redis 叢集
Redis 叢集會利用多個同時作用中的 Redis 伺服器來達到高可用性。 當 Redis 叢集做為 SignalR 的後擋板時,訊息會傳遞至叢集的所有節點,而不需要修改應用程式的程式碼。
叢集中的節點數目與後擋板的輸送量之間有取捨。 增加節點數目會增加叢集的可用性,但會減少輸送量,因為訊息必須傳輸至叢集中的所有節點。
在 SignalR 應用程式中,使用下列其中一種方法包含所有可能的 Redis 節點:
- 列出以逗號分隔之連接字串中的節點。
- 如果使用自訂行為進行連線失敗,請將節點新增至
ConfigurationOptions.Endpoints
。
下一步
如需詳細資訊,請參閱以下資源:
本文說明 設定 Redis 伺服器的SignalR特定層面,以用於向外延展 ASP.NET Core SignalR 應用程式。
警告
本文說明如何使用 連接字串。 使用本機資料庫時,使用者不需要經過驗證,但在生產環境中,連接字串 有時會包含要驗證的密碼。 資源擁有者密碼認證 (ROPC) 是生產資料庫中應避免的安全性風險。 實際執行應用程式應該使用可用的最安全驗證流程。 如需部署至測試或生產環境之應用程式驗證的詳細資訊,請參閱 保護驗證流程。
設定 Redis 後擋板
部署 Redis 伺服器。
重要
若要使用生產環境,只有在 Redis 後擋板在與 SignalR 應用程式相同的資料中心執行時,才建議使用 Redis 後擋板。 否則,網路延遲會降低效能。 如果您的 SignalR 應用程式是在 Azure 雲端中執行,建議您使用 Azure SignalR Service,而不是 Redis 後擋板。
如需詳細資訊,請參閱以下資源:
在 SignalR 應用程式中,安裝
Microsoft.AspNetCore.SignalR.Redis
NuGet 套件。在
Startup.ConfigureServices
方法中,呼叫AddSignalR
之後的AddRedis
:services.AddSignalR().AddRedis("<your_Redis_connection_string>");
視需要設定選項:
大部分選項都可以在連接字串或 ConfigurationOptions 物件中設定。
ConfigurationOptions
中指定的選項會覆寫連接字串中設定的選項。下列範例示範如何在
ConfigurationOptions
物件中設定選項。 此範例會新增通道前置詞,讓多個應用程式可以共用相同的 Redis 執行個體,如下列步驟所述。services.AddSignalR() .AddRedis(connectionString, options => { options.Configuration.ChannelPrefix = "MyApp"; });
在上述程式碼中,
options.Configuration
會使用連接字串中指定的任何項目初始化。如果您針對多個 SignalR 應用程式使用一部 Redis 伺服器,請針對每個 SignalR 應用程式使用不同的通道前置詞。
設定通道前置詞會將一個 SignalR 應用程式與使用不同通道前置詞的其他應用程式隔離。 如果您未指派不同的前置詞,從一個應用程式傳送至其所有用戶端的訊息,將會移至所有使用 Redis 伺服器作為後擋板之應用程式的所有用戶端。
為您的伺服器陣列負載平衡軟體設定黏性會話。 以下是一些文件範例,說明如何執行此動作:
Redis 伺服器錯誤
當 Redis 伺服器關閉時,SignalR 會擲回指出訊息不會傳遞的例外狀況。 一些典型的例外狀況訊息:
- 寫入訊息失敗
- 無法叫用中樞方法 'MethodName'
- 對 Redis 的連線失敗
SignalR 不會緩衝訊息,以在伺服器備份時傳送訊息。 Redis 伺服器關閉時傳送的任何訊息都遺失。
當 Redis 伺服器再次可用時,SignalR 會自動重新連線。
連線失敗的自訂行為
以下是示範如何處理 Redis 連線失敗事件的範例。
services.AddSignalR()
.AddRedis(o =>
{
o.ConnectionFactory = async writer =>
{
var config = new ConfigurationOptions
{
AbortOnConnectFail = false
};
config.EndPoints.Add(IPAddress.Loopback, 0);
config.SetDefaultPorts();
var connection = await ConnectionMultiplexer.ConnectAsync(config, writer);
connection.ConnectionFailed += (_, e) =>
{
Console.WriteLine("Connection to Redis failed.");
};
if (!connection.IsConnected)
{
Console.WriteLine("Did not connect to Redis.");
}
return connection;
};
});
Redis 叢集
Redis 叢集會利用多個同時作用中的 Redis 伺服器來達到高可用性。 當 Redis 叢集做為 SignalR 的後擋板時,訊息會傳遞至叢集的所有節點,而不需要修改應用程式的程式碼。
叢集中的節點數目與後擋板的輸送量之間有取捨。 增加節點數目會增加叢集的可用性,但會減少輸送量,因為訊息必須傳輸至叢集中的所有節點。
在 SignalR 應用程式中,使用下列其中一種方法包含所有可能的 Redis 節點:
- 列出以逗號分隔之連接字串中的節點。
- 如果使用自訂行為進行連線失敗,請將節點新增至
ConfigurationOptions.Endpoints
。
下一步
如需詳細資訊,請參閱以下資源: