後端使用SignalR發送資料通知前端vue

  • 496
  • 0
  • Vue
  • 2023-09-27

後端使用ASP.NET Web API SignalR發送資料通知前端vue

由於系統上客戶需要即時儀表板的功能,想要不用計時器setInterval這種方式,就用SignalR這種作法。

分成三個獨立的專案:

1.最先呼叫API的專案:在此不說明

2.ASP.NET Web API專案:SignalR 相關的套件、設定、API及Cors設定

需要先以Nuget安裝SignalR 相關的套件例如:Microsoft.AspNet.SignalR

BroadcastHub.cs

/// <summary>
/// 廣播 Hub
/// </summary>
public class BroadcastHub: Hub
{
}

BroadcastController.cs

public class BroadcastController : ApiController
{
	IHubContext hub = GlobalHost.ConnectionManager.GetHubContext<BroadcastHub>();

	/// <summary>
	/// 顯示單一訊息
	/// </summary>
	/// <param name="model"></param>
	/// <returns></returns>
	[HttpPost]
	[Route("ShowSingleMessage")]
	public IHttpActionResult ShowSingleMessage(MessageModel model)
	{
		hub.Clients.All.SingleMessage(model.Message);
		return Ok();
	}
}

補充:由於對Vue前端會有signalr跨域問題,因此需要設定如下:

WebApiConfig.cs

public static class WebApiConfig
	{
		public static void Register(HttpConfiguration config)
		{
			var cors = new EnableCorsAttribute("*", "*", "*");
			config.EnableCors(cors);
			
			//略...
		}
	}

Startup.cs

[assembly: OwinStartup(typeof(WebAPISignalR.Startup))]
namespace WebAPISignalR
{
	/// <summary>
	/// 初始
	/// </summary>
	public class Startup
	{
		/// <summary>
		/// 設定 SignalR 允許 Cors 跨域
		/// </summary>
		/// <param name="app"></param>
		public void Configuration(IAppBuilder app)
		{
			var hubConfiguration = new HubConfiguration();
			app.Map("/signalr", map =>
			{
				map.UseCors(CorsOptions.AllowAll);

				hubConfiguration.EnableJSONP = true;
				map.RunSignalR(hubConfiguration);
			});
			app.MapSignalR(hubConfiguration);
		}
	}
}

3.Vue專案:以vue-element-admin為基底的框架,也就是已經做好的Vue框架專案包、SignalR+jQuery 的相關的套件

前端需要安裝SignalR+jQuery的package並引用

npm i jquery signalr --S

main.js

import Vue from 'vue'
import jQuery from 'jquery'
import 'signalr'
//略...
new Vue({
  el: '#app',
  router,
  store,
  jQuery,
  render: h => h(App)
})

test.vue

<script>
window.jQuery = jQuery
require('signalr')

/**
     * SignalR呼叫
     */
    getData() {
      const vm = this

      // 下面對應到網址的部份
      const hub = jQuery.hubConnection(WebApiUrl)

      // 下面對應了.net的DefaultHub
      const proxy = hub.createHubProxy('BroadcastHub')

      proxy.on('SingleMessage', (data) => {
        //略...
      })
      hub.start()
    }
</script>

為避免忘記,特此記錄下來。