質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.34%
SignalR

SignalRは、マイクロソフト社のASP.NETを基盤とした技術の一つ。ASP.NETアプリにリアルタイム性を持たせることができるライブラリです。サーバサイドとクライアントサイド双方でのリアルタイム通信アプリの開発を容易にします。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

ASP.NET

ASP.NETは動的なWebサイトやWebアプリケーション、そしてWebサービスを構築出来るようにする為、Microsoftによって開発されたウェブアプリケーション開発フレームワークです。

Q&A

解決済

1回答

229閲覧

SignalRで指定URLだけに文字列を送信したい

imaten

総合スコア6

SignalR

SignalRは、マイクロソフト社のASP.NETを基盤とした技術の一つ。ASP.NETアプリにリアルタイム性を持たせることができるライブラリです。サーバサイドとクライアントサイド双方でのリアルタイム通信アプリの開発を容易にします。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

ASP.NET

ASP.NETは動的なWebサイトやWebアプリケーション、そしてWebサービスを構築出来るようにする為、Microsoftによって開発されたウェブアプリケーション開発フレームワークです。

1グッド

1クリップ

投稿2024/05/30 03:25

実現したいこと

ASP.NET Webformで、SignalRを使ってチャットツールの様なものを作っています。
ユーザーの登録などは行わず、URLに付与されたパラメータ文字列が同一のクライアント間でやり取りを行いたいです。
イメージとしては、「https://test.com/chat.aspx?room=aaaaa」の「aaaaa」
の部分が同一のページ同士でのみのやり取りです。

発生している問題・分からないこと

該当ページ全てにチャットを送ることはできていますが、パラメータなど任意のキーを指定して送る実装方法がわかりません。
可能であればサンプルコードや詳しい記事など教えていただけますと幸いです。

※記載のソースコードはテストのためにhtmlで記載していますが、本番はaspxで作成します。

該当のソースコード

html

1<!DOCTYPE html> 2<html> 3<head> 4    <title>SignalR Chat</title> 5</head> 6<body> 7    <input type="text" id="message" /> 8    <input type="button" id="sendButton" value="Send" /> 9    <ul id="messagesList"></ul> 10  11    <script src="Scripts/jquery-3.4.1.min.js"></script> 12    <script src="Scripts/jquery.signalR-2.4.3.min.js"></script> 13    <script src="signalr/hubs"></script> 14    <script type="text/javascript"> 15        $(function () { 16            var connection = $.hubConnection(); 17  18            var chat = connection.createHubProxy("chat"); 19  20      chat.on("ReceiveMessage", function (message, time) { 21        var encodedMsg = time + " : " + message; 22        var li = document.createElement("li"); 23        li.textContent = encodedMsg; 24        document.getElementById("messagesList").appendChild(li); 25            }); 26  27      $("#sendButton").click(function () { 28                var text = $("#message").val(); 29  30                $("#message").val(""); 31  32                chat.invoke("SendMessage", text); 33            }); 34  35            connection.start(); 36        }); 37    </script> 38</body> 39</html>

HubClass

1[HubName("chat")] 2public class ChatHub : Hub 3{ 4  public void SendMessage(string text) 5  { 6    Clients.All.ReceiveMessage(text, DateTime.Now.ToLongTimeString()); 7  } 8}

試したこと・調べたこと

  • teratailやGoogle等で検索した
  • ソースコードを自分なりに変更した
  • 知人に聞いた
  • その他
上記の詳細・結果

色々調べて見たところ「Clients.User(userId).send(message);」のようにユーザーIDをキーに送信することが出来るということは分かりました。
ただ今回の場合、ユーザー登録は行わず、可能であればDBも使いたくありません。
ブラウザを閉じた場合はチャットの履歴は見られなくなる仕様と考えています。

補足

ASP.Net .net Framework4.8
VisualStudio2022
Asp.Net.SignalR 2.4.3

経験が浅くご迷惑おかけしますが、よろしくお願いいたします。
不足情報があれば追記しますのでご教授ください。

len_souko👍を押しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

imaten

2024/05/31 03:57

URLありがとうございます。 指定したい文字列でグループを作り、参加者のみそのグループにAddすることで実現するイメージでしょうか? 後ほど試してみますが、ページロードのタイミングでRoomの文字列をグループ名として自分自身をグループに追加し、メッセージ送信は参加しているグループを対象に送信するということと理解しました。
len_souko

2024/05/31 08:42

僕が触ったのはめっちゃ昔なので、かなり忘れてるのもあって公式の説明ページをひょこっと張っておきました。 > ユーザーを複数回グループに追加しても安全であり、そのユーザーが既にグループに存在していても例外は発生しません。 ということなので自分がすでに追加されてるかどうかを考えなくてもよさそうです。 なので、ページロード時にURLからグループ名を取得してクライアントで保持。 その後参加するHubのメソッドへグループ名を渡して呼び、そこでグループへ追加してやれば以降は送りたいグループ名を毎度渡してメッセージ送信を行えば複数のグループに所属しての切り替えなんかもやれるかと思います
imaten

2024/05/31 12:23

ありがとうございます。 公式ドキュメントも確認していましたが、改めて見返すとグループで実現できそうですね。 知見のある方に教えていただくとより真剣に読もうとなるので助かります。 ちょっと直近まとまった時間が取れるか分からないのですが、教えていただいた方法で色々試してみます。 結果が分かり次第コメントで追記させていただきます。
imaten

2024/06/01 13:56

教えていただいた公式ドキュメントと >なので、ページロード時にURLからグループ名を取得してクライアントで保持。 その後参加するHubのメソッドへグループ名を渡して呼び、そこでグループへ追加してやれば以降は送りたいグループ名を毎度渡してメッセージ送信を行えば複数のグループに所属しての切り替えなんかもやれるかと思います この実装案でうまく解決しました。 teratail初心者でよくわかっていないのですが、ベストアンサー率のようなものありますよね? ベストアンサーにさせていただきたいので、簡単にで構いませんので回答のほうに転記お願いできませんでしょうか。
guest

回答1

0

ベストアンサー

質問へのコメントに記載した内容の転記に加筆した内容です

SignalR でユーザーとグループを管理する
こちらのグループのところを見ると書いてある通り、グループ管理機能を持っており、グループは文字列のグループ名で管理します。
なので、URLからグルーピングに使用する文字列を生成して作ってあげるとそのグループに対して一括送信できます。
また、同一クライアントで複数のグループに同時所属可能なので、古のネットゲームのようにパーティーチャットとギルドチャットや個人チャットを切り替えながら会話を行うといったことも再現可能です

投稿2024/06/01 20:22

len_souko

総合スコア1367

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

imaten

2024/06/01 22:10

転記ありがとうございます。 初めてSignalRを使うもので、初歩的な質問で恐縮でしたが実装案までいただけて助かりました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.34%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問