asp.Netcore使用signalR(一)
4748 ワード
asp.Netcore使用signalR(一)
Intro
SignalRとは何ですか.
ASP.NET Core SignalRは、アプリケーションにリアルタイムWeb機能を追加するプロセスを簡素化するオープンソースライブラリです.リアルタイムWeb機能により、サーバ側コードがリアルタイムでクライアントにコンテンツをプッシュできるようになります.
SignalRの適用対象:は、サーバからの高周波更新アプリケーションを必要とする.例えば、ゲーム、ソーシャルネットワーク、投票、オークション、地図、GPSアプリケーションなどです. ダッシュボードと監視アプリケーション.例には、企業ダッシュボード、販売ステータスの即時更新、またはストローク警告が含まれます. コラボレーションアプリケーション.コラボレーションアプリケーションの例には、ホワイトボードアプリケーションとチームミーティングソフトウェアが含まれます. 通知が必要なアプリケーション.ソーシャルネットワーク、Eメール、チャット、ゲーム、スケジュール警告、その他の多くのアプリケーションで通知が使用されています.
SignalRは、クライアントへのサーバのリモート・プロシージャ呼び出し(RPC)を作成するためのAPIを提供します.RPCは、サーバ側.NET Coreコードを介してクライアント上のJavaScript関数を呼び出します.
以下、ASP.NET Core SignalRのいくつかの機能:接続を自動的に管理します. は、すべての接続されたクライアントに同時にメッセージを送信する.例えば、チャットルーム. は、メッセージを特定のクライアントまたはクライアントグループに送信する. は、増加したトラフィックを処理するために拡張される.
トランスファ
SignalRは、リアルタイム通信を処理するためのいくつかの方法をサポートします. WebSockets サーバ送信イベント ロングポーリングSignalRは、サーバおよびクライアントがサポートする機能から最適な伝送方法 を自動的に選択する.
最近、クライアントとサーバ側の通信を実現するためにwebsocketを使用し、サーバ側が使用する
SignR基本使用
サービス登録
サービス構成は次のとおりです.
認証方式の構成
デフォルトのTokenは、要求ヘッダ
コンフィギュレーション
カスタムHub
Hub契約の定義
クライアントメソッドのインタフェースを定義して、強いタイプのクライアントメソッド呼び出しを実現します.ここで、クライアント呼び出しサーバ側のメソッドは、次のようなインタフェースを定義します.
Hubの定義
契約があれば、強いタイプのHubを定義することができます.例は以下の通りです.
Reference https://docs.microsoft.com/en-us/aspnet/core/signalr/introduction?view=aspnetcore-2.2 https://docs.microsoft.com/zh-cn/aspnet/core/signalr/introduction?view=aspnetcore-2.2
転載先:https://www.cnblogs.com/weihanli/p/use-signalr-in-aspnetcore.html
Intro
SignalRとは何ですか.
ASP.NET Core SignalRは、アプリケーションにリアルタイムWeb機能を追加するプロセスを簡素化するオープンソースライブラリです.リアルタイムWeb機能により、サーバ側コードがリアルタイムでクライアントにコンテンツをプッシュできるようになります.
SignalRの適用対象:
SignalRは、クライアントへのサーバのリモート・プロシージャ呼び出し(RPC)を作成するためのAPIを提供します.RPCは、サーバ側.NET Coreコードを介してクライアント上のJavaScript関数を呼び出します.
以下、ASP.NET Core SignalRのいくつかの機能:
トランスファ
SignalRは、リアルタイム通信を処理するためのいくつかの方法をサポートします.
最近、クライアントとサーバ側の通信を実現するためにwebsocketを使用し、サーバ側が使用する
SignalR
のような対戦ゲームをしています.SignR基本使用
サービス登録
サービス構成は次のとおりです.
services.AddSignalR(options =>
{
options.HandshakeTimeout = TimeSpan.FromSeconds(3);
options.KeepAliveInterval = TimeSpan.FromSeconds(10);
})
// JSON
.AddJsonProtocol(options =>
{
options.PayloadSerializerSettings.ContractResolver = new DefaultContractResolver();
options.PayloadSerializerSettings.DateTimeZoneHandling = DateTimeZoneHandling.Utc;
options.PayloadSerializerSettings.ReferenceLoopHandling = ReferenceLoopHandling.Ignore;
options.PayloadSerializerSettings.NullValueHandling = NullValueHandling.Ignore;
});
認証方式の構成
デフォルトのTokenは、要求ヘッダ
Authorization
から取得されるが、signalrがサーバ側を要求する場合は、要求アドレスのquery string access-token
に格納されるので、要求ヘッダから取得するか、QueryString
から取得するように構成する.services.AddAuthentication(options =>
{
options.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
options.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
options.DefaultForbidScheme = JwtBearerDefaults.AuthenticationScheme;
})
.AddIdentityServerAuthentication(options =>
{
options.Authority = Configuration["Authorization:Authority"];
options.RequireHttpsMetadata = false;
options.TokenRetriever = request =>
{
var token = TokenRetrieval.FromAuthorizationHeader()(request);
if (string.IsNullOrWhiteSpace(token))
{
token = TokenRetrieval.FromQueryString()(request);
}
return token;
};
});
コンフィギュレーション
app.UseAuthentication();
app.UseSignalR(builder =>
{
builder.MapHub("/hubs/quizGame"); // Hub
});
app.UseMvc();
カスタムHub
Hub契約の定義
クライアントメソッドのインタフェースを定義して、強いタイプのクライアントメソッド呼び出しを実現します.ここで、クライアント呼び出しサーバ側のメソッドは、次のようなインタフェースを定義します.
///
///
///
public interface IQuizGameClient
{
Task GameQuestionsReceived(QuizQuestion question);
Task MatchSuccess(GameInfo gameInfo);
Task GameAnswerResultReceived(CheckedUserQuizAnswerModel answer);
Task GameOver(GameResult result);
}
///
///
///
public interface IQuizGameServer
{
Task>> GetGameRules();
Task AutoMatch(int ruleId);
Task CheckQuestionAnswer(BaseQuizAnswer model, string gameId);
}
Hubの定義
契約があれば、強いタイプのHubを定義することができます.例は以下の通りです.
[Authorize(Policy = "bearer")]
public partial class QuizGameHub : Hub, IQuizGameServer
{
public Task>> GetGameRules()
{
return Task.FromResult(ServiceResult.Success(QuizGameStorage.GameRuleInfos));
}
// ...
public async Task CheckQuestionAnswer(BaseQuizAnswer model, string gameId)
{
//
await Clients.User(Context.UserIdentifier)
.GameAnswerResultReceived(checkedResult); //
}
public async Task AutoMatch(int ruleId)
{
// ...
}
}
Reference
転載先:https://www.cnblogs.com/weihanli/p/use-signalr-in-aspnetcore.html