一、搭建项目
1、创建一个ASP.NET Core MVC 项目
![4624570-943d76621cac2e08.png](https://upload-images.jianshu.io/upload_images/4624570-943d76621cac2e08.png)
2、nuget 下载和安装 MicroSoft.AspNetCore.SignalR
![4624570-5530b18a303bf8ff.png](https://upload-images.jianshu.io/upload_images/4624570-5530b18a303bf8ff.png)
vs提示版本冲突
![4624570-b7a8cbc87bc33c8d.png](https://upload-images.jianshu.io/upload_images/4624570-b7a8cbc87bc33c8d.png)
这时我们选择低版本即可
![4624570-5d4fb82349d6ca43.png](https://upload-images.jianshu.io/upload_images/4624570-5d4fb82349d6ca43.png)
![4624570-e021c9448ddeae46.png](https://upload-images.jianshu.io/upload_images/4624570-e021c9448ddeae46.png)
二、SignalR配置
1、在model中创建一个类MyHub 代码如下
![4624570-c5d0c98492470c64.gif](https://upload-images.jianshu.io/upload_images/4624570-c5d0c98492470c64.gif)
<pre class="prettyprint linenums prettyprinted" style="border-width: 1px 1px 1px 4px; border-style: solid; border-color: rgb(221, 221, 221); border-image: initial; margin: 15px 0px; font: 12px/20px "courier new"; white-space: pre-wrap; word-break: break-all; overflow-wrap: break-word; background: url("/img/codecolorer_bg.gif") center top rgb(251, 251, 251); padding: 10px 35px; box-shadow: rgb(238, 238, 238) 40px 0px 0px inset, rgb(51, 183, 150) 42px 0px 0px inset;">
- public class MyHub:Hub
- {
- public async Task SendMessage(string user, string message)
- {
- await Clients.All.SendAsync("ReceiveMessage", user+"["+DateTime.Now.ToLongTimeString()+"]", message);
- }
- public async Task SendMessageToUser(string user, string message)
- {
- await Clients.Client(Context.ConnectionId).SendAsync("ReceiveMessage", user + ":" + DateTime.Now.ToLongTimeString()+"]", message);
- }
- }
</pre>
View Code
2、在Startup中注入SignalR并在Configure中配置路由
![4624570-edad7f6d806da108.png](https://upload-images.jianshu.io/upload_images/4624570-edad7f6d806da108.png)
![4624570-2610ce34ef2846ef.png](https://upload-images.jianshu.io/upload_images/4624570-2610ce34ef2846ef.png)
3、右键项目名=>添加=>添加客户端库
![4624570-f9be1b871706d809.png](https://upload-images.jianshu.io/upload_images/4624570-f9be1b871706d809.png)
对于“提供程序”选择unpkg。
对于“库”输入 @aspnet/signalr@1.0.4 (@1.0.4 是根据 nuget SignalR的本本定的)。
选择“选择特定文件”,展开“dist/browser”文件夹,然后选择“signalr.js”和“signalr.min.js”。
将“目标位置”设置为 wwwroot/lib/signalr/,然后选择“安装”。
![4624570-f123422dc02f3680.png](https://upload-images.jianshu.io/upload_images/4624570-f123422dc02f3680.png)
![4624570-865b170f942057ad.png](https://upload-images.jianshu.io/upload_images/4624570-865b170f942057ad.png)
配置完毕。
三、编码实现
1、修改Views/Home中的Index.cshtml如下
![4624570-3b436c475e384542.gif](https://upload-images.jianshu.io/upload_images/4624570-3b436c475e384542.gif)
<pre class="prettyprint linenums prettyprinted" style="border-width: 1px 1px 1px 4px; border-style: solid; border-color: rgb(221, 221, 221); border-image: initial; margin: 15px 0px; font: 12px/20px "courier new"; white-space: pre-wrap; word-break: break-all; overflow-wrap: break-word; background: url("/img/codecolorer_bg.gif") center top rgb(251, 251, 251); padding: 10px 35px; box-shadow: rgb(238, 238, 238) 40px 0px 0px inset, rgb(51, 183, 150) 42px 0px 0px inset;">
- <div class="container">
- <div class="row"> </div>
- <div class="row">
- <div class="col-6"> </div>
- <div class="col-6">
- User..........<input type="text" id="userInput" />
- <br />
- Message...<input type="text" id="messageInput" />
- <input type="button" id="sendButton" value="Send Message" />
- </div>
- </div>
- <div class="row">
- <div class="col-12">
- <hr />
- </div>
- </div>
- <div class="row">
- <div class="col-6"> </div>
- <div class="col-6">
- <ul id="messagesList"></ul>
- </div>
- </div>
- </div>
- <script src="~/lib/signalr/dist/browser/signalr.js"></script>
- <script src="~/js/chat.js"></script>
</pre>
View Code
2、在js文件见创建一个js文件 chat.js
![4624570-75047f6fc9480ed7.gif](https://upload-images.jianshu.io/upload_images/4624570-75047f6fc9480ed7.gif)
<pre class="prettyprint linenums prettyprinted" style="border-width: 1px 1px 1px 4px; border-style: solid; border-color: rgb(221, 221, 221); border-image: initial; margin: 15px 0px; font: 12px/20px "courier new"; white-space: pre-wrap; word-break: break-all; overflow-wrap: break-word; background: url("/img/codecolorer_bg.gif") center top rgb(251, 251, 251); padding: 10px 35px; box-shadow: rgb(238, 238, 238) 40px 0px 0px inset, rgb(51, 183, 150) 42px 0px 0px inset;">
var connection = new signalR.HubConnectionBuilder().withUrl("/chatHub").build();
connection.on("ReceiveMessage", function (user, message) {
var msg = message.replace(/&/g, "&").replace(/</g, "<").replace(/>/g, ">");
var encodedMsg = user + " says " + msg;
var li = document.createElement("li");
li.textContent = encodedMsg;
document.getElementById("messagesList").appendChild(li);
});
connection.start().catch(function (err) {
return console.error(err.toString());
});
document.getElementById("sendButton").addEventListener("click", function (event) {
var user = document.getElementById("userInput").value;
var message = document.getElementById("messageInput").value;
connection.invoke("SendMessage", user, message).catch(function (err) {
return console.error(err.toString());
});
event.preventDefault();
});
</pre>
View Code
3、Ctrl+F5 运行出两个网页
![4624570-d228c1e13b485513.png](https://upload-images.jianshu.io/upload_images/4624570-d228c1e13b485513.png)
![4624570-7ad1442474a63a1f.gif](https://upload-images.jianshu.io/upload_images/4624570-7ad1442474a63a1f.gif)