リアルタイム Web チャット用の Asp.net MVC SignalR サンプル コードの詳細な説明
この記事では、リアルタイム Web チャットを実行するための Asp.net SignalR のサンプル コードを主に紹介します。興味のある友人は参照してください
この章で共有する内容は、Signal R を使用しています。フレームワーク簡単なグループチャット機能を作成します。主に.NetのMVCでこのフレームワークを使用する方法を説明します。このプロジェクトは公式ドキュメントがあるため、後ほど共有記事は書きません。結局のところ、これは Microsoft が推進するソリューションの 1 つです。
ASP.NET SignalR は、リアルタイム Web 機能をアプリケーションに追加するプロセスを簡素化する、ASP.NET 開発者向けのライブラリです。リアルタイム Web 機能は、サーバー コードが、クライアントが新しいデータを要求するのをサーバーに待機させるのではなく、コンテンツが利用可能になるとすぐに、接続されたクライアントにコンテンツをプッシュできる機能です。もちろん、SignalR は、非常にシンプルで使いやすい高レベルのAPI も提供します。これにより、サーバーはクライアントの JavaScript関数 を個別またはバッチで呼び出すことができ、非常に便利です。クライアントがサーバー側に接続するときなどの接続管理の実行、または切断、クライアント側の グループ化、およびクライアント側の承認はすべて、SignalR を使用して実装するのが非常に簡単です。
SignalR は、クライアントとのリアルタイム通信を ASP .NET にもたらします。もちろん使いやすく、拡張性も十分です。以前は、ユーザーはデータのリアルタイム表示を実現するためにページを更新するか、Ajax ポーリングを使用する必要がありました。現在では、SignalR を使用するだけで済みます。最も重要なことは、プロジェクトを再作成する必要がなく、既存の ASP .NET プロジェクトを使用して SignalR をシームレスに使用できることです。グループ チャット インスタンスの効果
まず、テスト ケースの効果を見てみましょう:MVC で SignalR を使用する方法
まず、通常は MVC Web プロジェクトを作成し、次に Nuget コンソール コマンドを使用して次のコマンドを追加します: Install-package Microsoft.AspNet.SignalR SignalR の依存関係は次のとおりです:
<package id="Microsoft.AspNet.SignalR" version="2.2.2" targetFramework="net45" /> <package id="Microsoft.AspNet.SignalR.Core" version="2.2.2" targetFramework="net45" /> <package id="Microsoft.AspNet.SignalR.JS" version="2.2.2" targetFramework="net45" /> <package id="Microsoft.AspNet.SignalR.SystemWeb" version="2.2.2" targetFramework="net45" />
jquery.signalR-2.2.2.min.js
[assembly: OwinStartup(typeof(Stage.Api.Extend.Startup))] namespace Stage.Api.Extend { public class Startup { public void Configuration(IAppBuilder app) { app.MapSignalR("/chat", new Microsoft.AspNet.SignalR.HubConfiguration { EnableDetailedErrors = true, EnableJavaScriptProxies = true }); } } }
OwinStartup(Type)
コンストラクター は型を渡します。この型は作成したクラスに対応します。これは、このコンストラクター クラスを通じて開始位置を示します。namespace Stage.Api.Extend
は私のプロジェクトの 名前空間 OwinStartup(Type)
构造函数传递的是一个类型,而这个类型对应的就是我们创建的Startup类,这个通过这个构造函数类标记起始位置;
2. namespace Stage.Api.Extend
是我项目的命名空间,这个可以随便定义;
3. public void Configuration(IAppBuilder app)
函数是固定必须的,这里程序会首先进入这个方法执行里面的逻辑代码;
4. 到这里后台需要的配置其实已经就完成了,下面是具体需要操作的业务逻辑处理类,新建一个类(这里我取名为ChatHub)并继承Hub(这是SignalR框架提供),然后里面的逻辑代码如下: 上面的3个方法分别做了:添加聊天人到List,发送信息到客户端,某个连接失效后通知各个有效的聊天人重新加载信息;这里值得关注的是通过重新 到这里后台的聊天室代码就完成了就是这么简单;我们再来看试图中如何来写代码,这里我先给出我的html布局代码: 客户端这里写法大致有两种选择,一种直接使用生成的代理来操作,一种不用自动生成的代理采用手动创建代理的方式;为了内容的简洁性,这里只简单讲解下自动生成的代理方式,而更多的是分享手动创建代理链接的方式; 使用生成的代理获取链接 首先,我们需要通过Script标签来引用一下自动生成代理的路径: 咋们逐步来解析下代码注意点: 1. 2. 通过chat.client.xxx来接收服务端通知的消息,而这个xxx对应的方法名称和咋们后端的Clients.All.xxx,本章实例对应的是:chat.client.userList = function (users){}对应Clients.All.userList(_Users);这样后端就能直接通知客户端的对应方法了;注意这里我后端Clients.All用的是通知全部客户端的意思,如果您需要通知指定的链接需要用到的是: 3. chat.client是后端调用客户端,那相对的chat.server就是客户端请求服务端,和上面一样通过chat.server.xxx来指定请求的服务端方法,注意这个时候服务端方法指的是继承类Hub的子类的公共方法(本篇对应的是:chat.server.sendAll(my, content)对应ChatHub.cs文件中的 4. 以上就是使用生成代理的方式,按照上面的注意点来写应该不是问题; 使用手动创建反向代理来链接 不采用生成的代码的方式,我们只需要修改前端就行了,后台代码不用变或设置不用变动;首先我们把上面说的Script引用自动代理的代码去掉,因为这个时候不需要了,我们还是先上代码:app.MapSignalR
是扩展的IAppBuilder接口方法,他有多种表现形式,这里我选择的是 public <a href="http://www.php.cn/wiki/188.html" target="_blank">static</a> IAppBuilder MapSignalR(this IAppBuilder builder, <a href="http://www.php.cn/wiki/57.html" target="_blank">string</a> path, HubConfiguration configuration);
、これは自由に定義できます 3. public void Configuration(IAppBuilder app) </code > 関数は修正されており、ここでのプログラムは最初にこれを入力します。メソッドは内部のロジック コードを実行します </p>🎜4. <code>app.MapSignalR
は拡張された IAppBuilderInterface🎜 メソッドには、さまざまな表現形式があります。ここでは public <a href="http://www.php.html" を選択します。 cn/wiki/188.html" target="_blank">静的 🎜 IAppBuilder MapSignalR(この IAppBuilder ビルダー、<a href="http://www.php.cn/wiki/57.html" target="_blank"> string🎜 path, HubConfiguration 構成);
を参照してください。これは、MVC の 🎜routing🎜 に少し似ています。ここで注目すべき点は、フロントエンド ページで使用する必要がある Path パラメーターです。public class ChatHub : Hub
{
//
public int Num = 10001;
public static List<MoHubUser> _Users = new List<MoHubUser>();
/// <summary>
/// 添加聊天人
/// </summary>
/// <param name="user"></param>
public void AddUser(MoHubUser user)
{
user.Id = Context.ConnectionId;
if (!_Users.Any(b => b.Id == user.Id))
{
_Users.Add(user);
}
//Clients.All.newUser(user);
Clients.All.userList(_Users);
}
/// <summary>
/// 发送信息
/// </summary>
/// <param name="user"></param>
/// <param name="message"></param>
public void SendAll(MoHubUser user, string message)
{
Clients.All.addNewMessageToPage(user, message);
}
/// <summary>
/// 某个聊天人退出是,通知所有在线人重新加载聊天人数
/// </summary>
/// <param name="stopCalled"></param>
/// <returns></returns>
public override System.Threading.Tasks.Task OnDisconnected(bool stopCalled)
{
var user = _Users.SingleOrDefault(x => x.Id == Context.ConnectionId);
if (user != null)
{
_Users.Remove(user);
Clients.All.userList(_Users);
}
return base.OnDisconnected(stopCalled);
}
}
public override System.Threading.Tasks.Task OnDisconnected(bool stopCalled)
方法来实现捕获并移除失效连接(这里是聊天人的信息);整篇测试用例通过Context.ConnectionId来保证连接的唯一性,只要有新的链接请求,那么服务端就会分配一个唯一串给这个链接,当客户端关闭页面或关闭链接这个是有就能在OnDisconnected方法中捕获到这个失效的链接的ConnectionId,这样就达到了移除失效聊天人的要求了;为了代码的方便性,这里创建了一个聊天人信息类:public class MoHubUser
{
public string Id { get; set; }
public string NickName { get; set; }
public string TransportMethod { get; set; }
}
@{
ViewBag.Title = "神牛聊天室 - SignalR";
}
<style type="text/css">
.p_left {
width: 70%;
float: left;
}
.p_right {
width: 28%;
float: left;
}
.ul {
list-style: none;
border: 1px solid #ccc;
height: 500px;
overflow-y: scroll;
color: black;
}
.ul li {
padding-top: 5px;
padding-right: 25px;
}
.ul_user {
list-style: none;
}
.ul_user li {
padding-top: 5px;
}
.send {
position: relative;
background: #eae7e7;
border-radius: 5px; /* 圆角 */
padding-top: 4px;
padding-left: 5px;
margin-top: 13px;
}
.send .arrow {
position: absolute;
top: -16px;
font-size: 0;
border: solid 8px;
border-color: #fff #fff #eae7e7 #fff;
}
</style>
<h3>@ViewBag.Title 在线人数:<span id="sapnUserTotal">0</span>人</h3>
<p class="container text-left">
<p class="p_left">
<ul class="ul" id="discussion"></ul>
<textarea rows="5" class="form-control" id="message" maxlength="500" placeholder="开始聊天. . ." style="max-width: 100%"></textarea><br />
<input type="button" id="sendmessage" value="发 送" class="btn btn-default" />
<input type="hidden" id="displayname" />
</p>
<p class="p_right">
<ul id="users" class="ul_user"></ul>
</p>
</p>
<script src="~/Scripts/jquery.signalR-2.2.2.min.js"></script>
@*<script src="~/chat/hubs"></script>*@
<script src="~/chat/hubs"></script>
,注意啦这里的路径/chat对应的就是咋们在前面Startup.cs文件中配置 app.MapSignalR("/chat"
路径,而后面/hubs固定的写法(至少目前我还没更多的试验过),只有先应用了这个~/chat/hubs,才能在后面使用生成的代理,先上段代码:var chat = $.connection.chatHub;
chat.client.newUser = function (user) {
$("#users").append(' <li><strong>' + user.NickName + '[' + user.TransportMethod + ']</strong></li>');
};
chat.client.userList = function (users) {
console.log(users);
$("#sapnUserTotal").html(users.length);
$.each(users, function (i, item) {
$("#users").append(' <li>[' + item.TransportMethod + '] <strong>' + item.NickName + '</strong>(' + item.Id + ')</li>');
});
};
chat.client.addNewMessageToPage = function (user, message) {
console.log(user);
$("#discussion").append(' <li ><span><strong>' + user.NickName + '[' + user.TransportMethod + ']</strong>:</span><p class="send">' + message + '<p class="arrow"></p></p></li>');
};
//connection.hub.start({ transport: ['webSockets', 'longPolling'] }).done(function () {
// my.TransportMethod = connection.hub.transport.name;
// chat.server.addUser(my);
// $('#sendmessage').click(function () {
// //console.log(chat);
// var content = $.trim($('#message').val());
// if (content.length <= 0) { $('#message').val('').focus(); return; }
// chat.server.sendAll(my, content);
// $('#message').val('').focus();
// });
//}).fail(function () {
// alert("链接聊天室失败,请重新刷新页面。");
//});
var chat = $.connection.chatHub;
这里的chatHub对应的就是咋们创建的并继承Hub的ChatHub类,由于js变量开头都是小写,所以这里是chatHub,这句活就表示链接到咋们后端了ChatHub类了,然后就可以使用里面的方法啦(这种有点类似于早期的webform中某种ajax请求的写法) T Client(string connectionId);
方法 public void SendAll(MoHubUser user, string message)
函数)connection.hub.start({ transport: ['webSockets', 'longPolling'] })
来指定运行的交互协议var my = { NickName: "神牛001", TransportMethod: "" };
var connection = $.hubConnection("/chat/hubs");
var chat = connection.createHubProxy('chatHub');
chat.on("userList", function (users) {
console.log(users);
$("#sapnUserTotal").html(users.length);
$("#users").html("");
$.each(users, function (i, item) {
$("#users").append(' <li>[' + item.TransportMethod + '] <strong>' + item.NickName + '</strong>(' + item.Id + ')</li>');
});
});
chat.on("addNewMessageToPage", function (user, message) {
console.log(user);
$("#discussion").append(' <li ><span><strong>' + user.NickName + '[' + user.TransportMethod + ']</strong>:</span><p class="send">' + message + '<p class="arrow"></p></p></li>');
var p = document.getElementById('discussion');
//p.scrollTop = p.scrollHeight;
p.scrollTop = 999999;
});
var nickName = prompt("请输入一个昵称:", my.NickName);
my.NickName = nickName.length > 0 ? nickName : my.NickName;
$('#displayname').val(nickName);
$('#message').focus();
connection.start({ transport: ['webSockets', 'longPolling'] }).done(function () {
my.TransportMethod = connection.transport.name;
//console.log(my.TransportMethod);
chat.invoke("addUser", my);
$('#sendmessage').click(function () {
var content = $.trim($('#message').val());
if (content.length <= 0) { $('#message').val('').focus(); return; }
chat.invoke("sendAll", my, content);
$('#message').val('').focus();
});
});
同样列出如下注意点:
1. var connection = $.hubConnection("/chat/hubs");
创建链接,这里的path同样对应后端的 app.MapSignalR("/chat" ,路径保持一致
2. var chat = connection.createHubProxy('chatHub');
来创建反向代理链接,这里的name:chatHub对应的是后端的ChatHub类名称
3. 通过on("xxx",function(){})函数来绑定服务端通知客户端的事件,xxx对应Clients.All.xxx中的xxx
4. connection.start({transport: ['webSockets', 'longPolling'] })
で、許可されるリンク メソッドを設定し、リンクを開始します connection.start({ transport: ['webSockets', 'longPolling'] })
来设置允许的链接方式,并开始链接
5. connection.transport.name来获取链接的方式名称,默认start不设置的话有这么几种:webSockets,foreverFrame,serverSentEvents,longPolling
6. chat.invoke("xxx", param1, param2)通过invoke来映射继承类Hub的类的公共方法,这里实例对应的是: chat.invoke("sendAll", my, content)
对应 public void SendAll(MoHubUser user, string message)
6. chat.invoke("xxx", param1, param2) は、invoke を使用して、この例は、 chat.invoke("sendAll", my, content)
に対応します。 public void SendAll(MoHubUser user, string message)
>に書かれています
以上がリアルタイム Web チャット用の Asp.net MVC SignalR サンプル コードの詳細な説明の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ホットAIツール

Undresser.AI Undress
リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover
写真から衣服を削除するオンライン AI ツール。

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

AI Hentai Generator
AIヘンタイを無料で生成します。

人気の記事

ホットツール

メモ帳++7.3.1
使いやすく無料のコードエディター

SublimeText3 中国語版
中国語版、とても使いやすい

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

SublimeText3 Mac版
神レベルのコード編集ソフト(SublimeText3)

ホットトピック









1. module を使用したファイルへのログ出力:logging はカスタム レベルのログを生成し、指定したパスにログを出力できます ログ レベル: debug (デバッグ ログ) = 5) {clearTimeout (time) // すべての結果が取得された場合 10連続した時間が空です スケジュールされたタスクのログをクリアします}return}if(data.log_type==2){//新しいログが取得された場合 for(i=0;i

Caddy の概要 Caddy は強力で拡張性の高い Web サーバーであり、現在 Github 上に 38,000 以上のスターが付いています。 Caddy は Go 言語で書かれており、静的リソースのホスティングとリバース プロキシに使用できます。 Caddy には以下の主な特徴があります: Nginx の複雑な構成と比較して、元の Caddyfile 構成は非常にシンプルです; 提供する AdminAPI を通じて構成を動的に変更できます; デフォルトで自動 HTTPS 構成をサポートし、自動的に適用して構成できますHTTPS 証明書; 数万のサイトのデータに拡張可能; 追加の依存関係なしでどこでも実行可能; Go 言語で記述されているため、メモリの安全性がより保証されます。まずはCentOに直接インストールします

JavaAPI 開発における Web サーバー処理に Jetty7 を使用する インターネットの発展に伴い、Web サーバーはアプリケーション開発の中核部分となり、多くの企業でも注目を集めています。増大するビジネス ニーズを満たすために、多くの開発者が Web サーバー開発に Jetty の使用を選択しており、その柔軟性と拡張性は広く認識されています。この記事では、JavaAPI 開発における Jetty7 の使用方法を紹介します。

顔面遮蔽弾幕とは、映像内の人物を遮ることなく大量の弾幕が浮遊し、人物の背後から浮遊しているように見せることです。機械学習は数年前から普及していますが、これらの機能がブラウザでも実行できることは多くの人に知られていません。この記事では、ビデオ連発における実際的な最適化プロセスを紹介します。記事の最後に、適用可能なシナリオをいくつか示します。このソリューションを開くことを望んでいます。いくつかのアイデアがあります。 mediapipeDemo (https://google.github.io/mediapipe/) は、顔ブロック弾幕のオンデマンドアップアップロードの主流の実装原理を示していますサーバーのバックグラウンド計算により、ビデオ画面内のポートレート領域を抽出し、SVG ストレージに変換しますクライアントがビデオを再生している間、サーバーから SVG をダウンロードし、弾幕、ポートレートと組み合わせる

まず、frpって何?という疑問があると思います。簡単に言うと、frp はイントラネット侵入ツールであり、クライアントを設定すると、サーバー経由でイントラネットにアクセスできるようになります。現在、私のサーバーは Web サイトとして nginx を使用しており、ポート 80 が 1 つだけあります。では、FRP サーバーもポート 80 を使用したい場合はどうすればよいでしょうか?クエリ後、nginx のリバース プロキシを使用してこれを実現できます。追加: frps はサーバー、frpc はクライアントです。ステップ 1: サーバーの nginx.conf 構成ファイルを変更し、次のパラメータを nginx.conf の http{} に追加します。server{listen80

フォーム検証は Web アプリケーション開発において非常に重要なリンクであり、フォーム データを送信する前にデータの有効性をチェックして、アプリケーションのセキュリティ脆弱性やデータ エラーを回避できます。 Web アプリケーションのフォーム検証は、Golang を使用すると簡単に実装できます。この記事では、Golang を使用して Web アプリケーションのフォーム検証を実装する方法を紹介します。 1. フォーム検証の基本要素 フォーム検証の実装方法を紹介する前に、フォーム検証の基本要素が何であるかを知る必要があります。フォーム要素: フォーム要素は

Cockpit は、Linux サーバー用の Web ベースのグラフィカル インターフェイスです。これは主に、初心者/熟練ユーザーにとって Linux サーバーの管理を容易にすることを目的としています。この記事では、Cockpit アクセス モードと、CockpitWebUI から Cockpit への管理アクセスを切り替える方法について説明します。コンテンツ トピック: コックピット エントリ モード 現在のコックピット アクセス モードの確認 CockpitWebUI からコックピットへの管理アクセスを有効にする CockpitWebUI からコックピットへの管理アクセスを無効にする まとめ コックピット エントリ モード コックピットには 2 つのアクセス モードがあります。 制限付きアクセス: これは、コックピット アクセス モードのデフォルトです。このアクセス モードでは、コックピットから Web ユーザーにアクセスできません。

Web 標準は、W3C およびその他の関連組織によって策定された一連の仕様とガイドラインです。HTML、CSS、JavaScript、DOM、Web アクセシビリティおよびパフォーマンスの最適化の標準化が含まれます。これらの標準に従うことで、ページの互換性を向上させることができます。 、メンテナンス性とパフォーマンス。 Web 標準の目標は、Web コンテンツをさまざまなプラットフォーム、ブラウザー、デバイス上で一貫して表示および操作できるようにして、より優れたユーザー エクスペリエンスと開発効率を提供することです。
