创建webapi项目,只是搭配服务用,什么三层mvc都不弄了,默认的模板直接用就好。

简单分析下,采用signalr通信来传递mac地址,所以先安装个signalr的包(如果简单操作的话可以不装最新的,微软自带一个,不过好像是弃用的)

using Microsoft.AspNetCore.SignalR;

创建一个继承HUB的辅助类,主要功能就是服务端和客户端通信

补充一下HUB类怎么写

 public class SignalRHub : Hub
{
private readonly IHubContext<SignalRHub> _hubContext;
private readonly List<string> connectionIDs;
private readonly IMemoryCache _memoryCache;
private int num; public SignalRHub(IHubContext<SignalRHub> hubContext, IMemoryCache memoryCache)
{
connectionIDs = new List<string>();
_hubContext = hubContext;
_memoryCache = memoryCache;
} #region 收
public void Mac1(string macMsg)
{
num++;
if (!string.IsNullOrEmpty(macMsg) || num == connectionIDs.Count)
{
num = 0;
_memoryCache.Set("mac", macMsg); // 存储mac值到内存缓存中
}
}
#endregion #region 传
/// <summary>
/// 客户端连接之后立马执行
/// </summary>
/// <returns></returns>
public override async Task OnConnectedAsync()
{
// 保存连接的客户端到上下文中
connectionIDs.Add(Context.ConnectionId);
await Clients.Caller.SendAsync("Connected", Context.ConnectionId);
//添加到组
await Groups.AddToGroupAsync(Context.ConnectionId, "Mac");
await base.OnConnectedAsync();
} public async Task<string> SendIP(string ip)
{
//await Clients.All.SendAsync("匹配IP", ip);//给所有的客户端发送IP进行匹配
await _hubContext.Clients.Group("Mac").SendAsync("匹配IP", ip);
await Task.Delay(2000);
string mac = _memoryCache.Get<string>("mac"); // 从内存缓存中读取mac值
return mac;
}
#endregion
}

using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.SignalR; namespace MacService.Controllers
{
[Route("api/[controller]")]
[ApiController]
public class MacSignalRController : ControllerBase
{
/// <summary>
/// 辅助类注入进来
/// </summary>
private readonly SignalRHub _signalRHub;
/// <summary>
/// 构造函数注入
/// </summary>
/// <param name="SignalRHub"></param>
public MacSignalRController(SignalRHub SignalRHub)
{
_signalRHub = SignalRHub;
}
/// <summary>
/// POST请求,传入ip比对客户端ip拿到mac地址
/// </summary>
/// <param name="ip"></param>
/// <returns></returns>
[HttpPost]
public async Task<string> SendMessage([FromBody] string ip)
{
return await _signalRHub.SendIP(ip);
}
}
}

写一个接口,给前端浏览器用,传入ip和安装了服务的电脑的ip对比,拿到对应的mac地址

using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.SignalR; namespace MacService.Controllers
{
[Route("api/[controller]")]
[ApiController]
public class MacSignalRController : ControllerBase
{
/// <summary>
/// 辅助类注入进来
/// </summary>
private readonly SignalRHub _signalRHub;
/// <summary>
/// 构造函数注入
/// </summary>
/// <param name="SignalRHub"></param>
public MacSignalRController(SignalRHub SignalRHub)
{
_signalRHub = SignalRHub;
}
/// <summary>
/// POST请求,传入ip比对客户端ip拿到mac地址
/// </summary>
/// <param name="ip"></param>
/// <returns></returns>
[HttpPost]
public async Task<string> SendMessage([FromBody] string ip)
{
return await _signalRHub.SendIP(ip);
}
}
}

因为有用到依赖注入,所以要在Program.cs文件进行注册

1.signalr   2.SignalRHub辅助类   3.MemoryCache 

builder.Services.AddSignalR();
    builder.Services.AddScoped<SignalRHub>();
    builder.Services.AddMemoryCache();

还有要给signalr暴露出来让客户端可以连接,好像是这样解释吧,不知道怎么解释

     app.MapHub<SignalRHub>("/signalrhub");    

然后你的ip+端口+signalrhub  类似与:https://123.321.456.567:1234/signalrhub  这样,如下图则为成功


现在弄windows服务,这个博客园有大佬写了,我也是看的那个,这里贴个链接

使用.NET Core创建Windows服务详细步骤 - willingtolove - 博客园 (cnblogs.com)

安装和卸载的命令发一下

@echo off 
chcp 65001
@title 安装windows服务
@echo off
echo= 安装服务!
@echo off
@sc create MacClientAssist binPath= "%~dp0MacClientAssist.exe"
echo= 启动服务!
@echo off
@sc start MacClientAssist
@echo off
echo= 配置服务!
@echo off
@sc config MacClientAssist start= AUTO
@echo off
echo= 成功安装、启动、配置服务!
@pause
@echo off
chcp 65001
@title 卸载Windows服务
@echo off
echo 正在停止服务...
@echo off
@sc stop MacClientAssist
echo 正在卸载服务...
@echo off
@sc delete MacClientAssist
echo 服务已成功卸载。
@pause

           

做一个windos服务和api搭配,获取电脑的mac地址的更多相关文章

  1. java工具类,在Windows,Linux系统获取电脑的MAC地址、本地IP、电脑名

    package com.cloudssaas.util; import java.io.BufferedReader; import java.io.IOException; import java. ...

  2. 【C++】【纯代码】获取电脑的mac地址

    bool GetMacAddress(CString &LanMAC) { #define MAX_ADAPTER_NAME_LENGTH 256 #define MAX_ADAPTER_DE ...

  3. Unity网络通讯(一)获取计算机的MAC地址

    1 string GetMac() { string mac = ""; mac = GetMacAddressBySendARP(); return mac; } [DllImp ...

  4. C#开发BIMFACE系列8 服务端API之获取文件上传状态信息

    系列目录     [已更新最新开发文章,点击查看详细] 在BIMFACE控制台上传文件,上传过程及结束后它会自动告诉你文件的上传状态,目前有三种状态:uploading,success,failure ...

  5. C#开发BIMFACE系列10 服务端API之获取文件下载链接

    系列目录     [已更新最新开发文章,点击查看详细] 通过BIMFACE控制台或者调用服务接口上传文件成功后,默认场景下需要下载该源文件,下载文件一般需要知道文件的下载链接即可.BIMACE平台提供 ...

  6. C#开发BIMFACE系列3 服务端API之获取应用访问凭证AccessToken

    系列目录     [已更新最新开发文章,点击查看详细] BIMFACE 平台为开发者提供了大量的服务器端 API 与 JavaScript API,用于二次开发 BIM 的相关应用. BIMFACE ...

  7. C#开发BIMFACE系列7 服务端API之获取文件信息列表

    系列目录     [已更新最新开发文章,点击查看详细] 本文详细介绍如何获取BIMFACE平台中所有上传过的文件信息列表. 请求地址:GET https://file.bimface.com/file ...

  8. C#开发BIMFACE系列9 服务端API之获取应用支持的文件类型

    系列目录     [已更新最新开发文章,点击查看详细] BIMFACE最核心能力之一是工程文件格式转换.无需安装插件,支持数十种工程文件格式在云端转换,完整保留原始文件信息.开发者将告别原始文件解析烦 ...

  9. C#开发BIMFACE系列19 服务端API之获取模型数据4:获取多个构件的共同属性

    系列目录     [已更新最新开发文章,点击查看详细] 在前几篇博客中介绍了一个三维文件/模型包含多个构建,每个构建又是由多种材质组成,每个构建都有很多属性.不同的构建也有可能包含相同的属性. 上图中 ...

  10. C#开发BIMFACE系列21 服务端API之获取模型数据6:获取单模型的楼层信息

    系列目录     [已更新最新开发文章,点击查看详细] 一个文件/模型中可能包含多个楼层信息,获取楼层信息对于前端页面的动态展示非常有帮助.本篇介绍获取一个文件/模型中可能包含多个楼层信息的详细方法. ...

随机推荐

  1. 带你玩转nginx负载均衡

    nginx跨多个应用程序实例的负载平衡是一种用于优化资源利用率,最大化吞吐量,减少延迟和确保容错配置的常用技术. 环境介绍 配置nginx负载均衡器因会用到多台服务器来进行,所以下面我会用到docke ...

  2. Webpack热加载显示 'Cannot get /' 解决办法

    安装webpack-dev-server后,用 npm 打包运行,打开后显示 'Cannot get /' : 需要在webpack.config.js的devServer中添加以下代码: 现在再次运 ...

  3. Shell简单入门程序参考

    目录 0 前言 0.1 shell初试 1 程序功能 1.1 显示当前主机名和IP地址. 1.1.1 if 语句 详解 1.2 创建目录或者文件 1.3 修改文件属性 1.3.1 chmod 修改文件 ...

  4. element-ui带输入建议的input框踩坑

    踩坑问题描述: 问题一: 获取到后端返回的数组,并将数组传入作为 results 传入 callback 后,焦点放在 输入框 上的时候,并未出现任何内容,只出现了一个不完整的空白框. 问题解决方案: ...

  5. Redis数据结构:List类型全面解析

    文章目录 一.List数据类型 1.1 简介 1.2 应用场景 1.3 底层结构 二.数据结构 2.1 压缩列表ZipList 2.2 双向链表LinkedList(后续已废弃) 2.3 快速链表Qu ...

  6. 【问题解决】Tomcat由低于8版本升级到高版本使用Tomcat自带连接池报错无法找到表空间的问题

    问题复现 项目上历史项目为解决漏洞扫描从Tomcat 6.0升级到了9.0版本,服务启动的日志显示如下警告,数据源是通过JNDI方式在server.xml中配置的,控制台上狂刷无法找到表空间的错误(没 ...

  7. 3、oracle内存讲解

    oracle数据库实例(instance) 数据库打开以后,会生成一个内存结构和一堆进程 内存和进程:就是oracle的实例instance oracle数据库实例结构: 用户是通过连接实例来访问数据 ...

  8. 返璞归真!使用 alpinejs 开发交互式 web 应用,抛弃 node_modules 和 webpack 吧!

    前言 最近一直在使用 DjangoStarter 开发各种小项目,之前我是比较喜欢前后端分离的,后端用 Ninja API,前端 nextjs,开发起来也挺舒服的,交互体验也比较好. 不过我在网上冲浪 ...

  9. WordCloudStudio 支持支付宝周期性订阅

    我们很高兴地宣布,WordCloudStudio 现已支持通过支付宝 (AliPay) 的周期性订阅支付功能!无论您是需要制作精美的词云图用于演示.社交媒体.教育资源,还是其他创意项目,现在都可以更便 ...

  10. Linux系统进程

    系统进程 [1].进程基本概述 当我们运行一个程序,那么我们将运行的程序叫进程 ​ PS1:当程序运行为进程后,系统会为该进程分配内存,以及进程运行的身份和权限 ​ PS2:在进程运行的过程中,服务器 ...