最近在维护一个稍老一些的项目,项目当时使用webapi2写的,但是并没有用上及时推送功能,现在要加上,只好在老的项目基础上做文章,目前市面上asp.net webapi的signalr的前后端分离方案不是很多,质量也不敢保证,经过一番研究,总算走通了.把简单的实现放到这里,为自己和后面的人铺好路.
安装nuget包
配置startup
写一个hub
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using Microsoft.AspNet.SignalR;
using Microsoft.AspNet.SignalR.Hubs;
namespace lingcheng_web_api.SignalR
{
[HubName("RepairHub")]
public class RepairHub : Hub
{
public void Hello()
{
Clients.All.hello();
}
public void Send(string message)
{
var name = Guid.NewGuid().ToString().ToUpper();
Clients.All.SendMessage(name, message);
}
public void showMessage(object message)
{
Clients.All.SendMessage(message.ToString());
}
}
}
在controller中使用
/// <summary>
/// 触发hub的api
/// </summary>
/// <param name="request">request</param>
/// <returns>message</returns>
[AllowAnonymous]
[Route("show/hub"), HttpGet]
public HttpResponseMessage GetMessage(HttpRequestMessage request)
{
var hub = GlobalHost.ConnectionManager.GetHubContext<RepairHub>();
//注意这里的showMessage 就是对RepairHub下定义的showMessage方法调用,同样前端也是调用这个方法
hub.Clients.All.showMessage("这里面可以放入任意对象,前台可以收到此内容");
return request.CreateResponse(HttpStatusCode.OK,);
}
api端就完成了,
处理web端
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>signalr</title>
<script src="https://cdn.bootcss.com/jquery/2.2.4/jquery.js"></script>
<script src="https://cdn.bootcss.com/signalr.js/2.4.0-preview1-20180920-03/jquery.signalR.min.js"></script>
<script src="./signalr/hubs"></script>
<script>
$(function () {
$.connection.hub.url = "./signalr";
var hub=$.connection.RepairHub;
//此处的showMessage就是api端hub里定义的showMessage方法
hub.client.showMessage = function (msg) {
console.log(msg)
}
//日志输出
$.connection.hub.logging= true;
$.connection.hub.start();
});
</script>
</head>
<body>
<div>signalr</div>
</body>
</html>
将此页面放到api项目的启动根目录下,项目启动访问该页面即可
注意因为没有做cors跨域处理,放到别的url下会出错.如果要做跨域处理,可以在startup中加入
app.UseCors(CorsOptions.AllowAll);
不知为何我的项目就是不识别这段代码,如有哪位大佬知道为何,烦劳写在评论里,为他人借鉴,谢谢
效果:
总结
首先安装signalR包,然后再webapi的startup配置,编写hub总线,最后在controller中调用处理.
前端(web)应用必要文件jquery.js,signalr.js以及weibapi中signalr动态生成的hubs文件, 然后连接hub,对hub的调用方法监听即可.signalr还有很多其他的高级用法,就需要参照官方文档及api文档去使用了.