C# APS.NET CORE 6.0 WEB API IIS部署

news2024/11/29 14:51:38

1.创建 APS.NET CORE6.0 WEB API项目

默认选项即可

源代码:

项目文件展开:

launchSettings.json

{
  "$schema": "https://json.schemastore.org/launchsettings.json",
  "iisSettings": {
    "windowsAuthentication": false,
    "anonymousAuthentication": true,
    "iisExpress": {
      "applicationUrl": "http://localhost:19488",
      "sslPort": 44308
    }
  },
  "profiles": {
    "ServerSideApi": {
      "commandName": "Project",
      "dotnetRunMessages": true,
      "launchBrowser": true,
      //"launchUrl": "swagger",
      //"applicationUrl": "https://192.168.3.24:8080;http://192.168.3.24:8081",
      "environmentVariables": {
        "ASPNETCORE_ENVIRONMENT": "Development"
      }
    },
    "IIS Express": {
      "commandName": "IISExpress",
      "launchBrowser": true,
      "launchUrl": "swagger",
      "environmentVariables": {
        "ASPNETCORE_ENVIRONMENT": "Development"
      }
    }
  }
}

Controllers\HomeController.cs

using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using ServerSide.BLL;
using ServerSide.Common;
using ServerSide.Models;

namespace ServerSideApi
{
    [Route("api")]
    [ApiController]
    public class HomeController : ControllerBase
    {
        readonly IService<Users>? usersService;
        public HomeController(IService<Users> usersService)
        {
            this.usersService = usersService;
        }
        [HttpGet("GetLogin")]//GetLogin {}{account}/{password}
        public async Task<string> Get(string account, string password)
        {
            //jwt token
            //登录成功之后生成令牌{account:'zhangsan',password:'123456'}
            string? token = "0";//token令牌
            Users? users= await usersService!.GetAsync(m => m.Account == account
                        && m.Password == DataEncrypt.MD5Encrypt(password));
            if (users != null) 
            {
                token = Guid.NewGuid().ToString(); //users.Account;
                RedisCache.SetCache(token, users.Account!);//36不会重复
            }
            return token;
        }
    }
}

Controllers\SystemActionController.cs

using Bogus.Bson;
using Microsoft.AspNetCore.Mvc;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
using ServerSide.Common;
using ServerSide.DAL;
using ServerSide.Models;
using System.Text.Json.Nodes;

namespace ServerSideApi.Controllers
{
    public class SystemActionController : Controller
    {
        private string msgModel = "{{\"code\":{0},\"message\":\"{1}\",\"result\":{2}}}";
        //检查用户名是否已注册

        /// <summary>
        /// 获取对应订单激活码
        /// </summary>
        /// <param name="OrderInfo">订单号</param>
        /// <returns></returns>
        #region 获取激活码
        [HttpGet("GetActionKey")]//GetLogin {}{account}/{password}
        public string GetActionKey(string OrderInfo)
        {
            string systemActionKey = string.Empty;
            int i = 0;
            using (EFContext db=new EFContext())
            {
                systemActionKey = db!.SystemActionEntity!.ToList()!.Where((s) => s.OrderInfo == OrderInfo && s.ActionStatId == 2).FirstOrDefault()!.KeyCode!;
                if(systemActionKey.Length>5)
                {
                    db!.SystemActionEntity!.ToList()!.ForEach((s) => {
                        if (s.KeyCode == systemActionKey)
                        {
                            s.ActionStatId = 3;
                        }
                        i=db!.SaveChanges();
                        LogHelper.Info(i > 0 ? $@"OrderInfo:{OrderInfo} Action Key Read {systemActionKey} PASS" : $@"OrderInfo:{OrderInfo} Action Key Read FAIL");  
                    });
                }
                if (i>0||systemActionKey.Length>5)
                    return string.Format(msgModel, (int)(ResponseCode.成功), "成功", systemActionKey);
                else
                    return string.Format(msgModel, (int)(ResponseCode.操作失败), "失败", "null");
            }
        }
        #endregion

        /// <summary>
        /// 获取对应订单末激活信息
        /// </summary>
        /// <param name="OrderInfo">订单信息</param>
        /// <returns></returns>
        #region 获取末激活数据
        [HttpGet("GetAllNotActionData")]//GetLogin {}{account}/{password}
        public string GetAllNotActionData(string OrderInfo)
        {
            List<SystemActionEntity>systemActionEntities = new List<SystemActionEntity>();
            using(EFContext db=new EFContext())
            {
                db!.SystemActionEntity!.ToList()!.ForEach((s) => { 
                    if(s.OrderInfo==OrderInfo&&s.ActionStatId==2)//1.已激活、2.末激活中、3.激活中
                    {
                        systemActionEntities.Add(s);
                    }
                });
            }
            LogHelper.Info(systemActionEntities.Count > 0 ? $@"OrderInfo:{OrderInfo} Not Action Data Read PASS" : $@"OrderInfo:{OrderInfo} Not Action Data Read FAIL");
            if (systemActionEntities.Count>0)
            {
                return string.Format(msgModel, (int)(ResponseCode.成功), "成功", JsonConvert.SerializeObject(systemActionEntities));
            }
            else
                return string.Format(msgModel, (int)(ResponseCode.操作失败), "失败", JsonConvert.SerializeObject(systemActionEntities));
        }
        #endregion

        /// <summary>
        /// 获取所有激活数据
        /// </summary>
        /// <param name="OrderInfo">订单信息</param>
        /// <returns></returns>
        #region 获取所有已激活的数据
        [HttpGet("GetAllIsActionData")]
        public string GetAllIsActionData(string OrderInfo) //List<SystemActionEntity>
        {
            lock(this)
            {
                List<SystemActionEntity> systemActionEntities = new List<SystemActionEntity>();
                using (EFContext db = new EFContext())
                {
                    db!.SystemActionEntity!.ToList()!.ForEach((s) => {
                        if (s.OrderInfo == OrderInfo && s.ActionStatId == 1)//1.已激活、2.末激活中、3.激活中
                        {
                            systemActionEntities.Add(s);
                        }
                    });
                }

                if (systemActionEntities.Count > 0)
                {
                    return string.Format(msgModel, (int)(ResponseCode.成功), "成功", JsonConvert.SerializeObject(systemActionEntities));
                }
                else
                {
                    return string.Format(msgModel, (int)(ResponseCode.操作失败), "失败", JsonConvert.SerializeObject(systemActionEntities));
                }
            }    
        }
        #endregion

        /// <summary>
        /// 更新激活数据
        /// </summary>
        /// <param name="macAddress">mac地址</param>
        /// <param name="BarcodeNo">sn条码</param>
        /// <param name="keyCode">激活码</param>
        /// <returns></returns>
        #region 更新激活数据
        [HttpPut("UpdateActionData")]
        public string UpdateActiopnData(string macAddress,string BarcodeNo,string keyCode)
        {
            using(EFContext db = new EFContext()) 
            {
                db!.SystemActionEntity!.ToList()!.ForEach((s) => {
                    if(s.KeyCode==keyCode)
                    {
                        s.MacAddress = macAddress;
                        s.ActionStatId = 1;
                        s.BarcodeNo = BarcodeNo;
                    }
                });
                int result=db!.SaveChanges();
                if(result>0)
                {
                    return string.Format(msgModel, (int)(ResponseCode.成功), "成功", $@"KeyCode:{keyCode} Data Update Pass!!");
                }
                else
                {
                    return string.Format(msgModel, (int)(ResponseCode.操作失败), "失败", $@"KeyCode:{keyCode} Data Update Fail!!");
                }
            }
        }
        #endregion
    }
}

Controllers/UsersController.cs

using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using ServerSide.BLL;
using ServerSide.Common;
using ServerSide.Models;
using ServerSideApi.Filters;

namespace ServerSideApi
{
    [ApiController, Route("api/users"),TypeFilter(typeof(UsersAuthorizeAttribute))]
    public class UsersController : ControllerBase
    {
        readonly IService<Users>? usersService;
        public UsersController(IService<Users> usersService)
        {
            this.usersService = usersService;
        }
        //https://localhost:8080/api/users/zhangsan

        //HttpGet查询 HttpPost添加 HttpPut修改 HttpDelete删除
        //[HttpGet]
        //public List<Users> Get()
        //{
        //    return usersService!.GetAll().ToList();
        //}

        //[HttpGet("{account}")]
        //public Users Get(string account)
        //{
        //    return usersService!.Get(account);
        //}

        //[HttpGet("{account}/{password}")]//GetLogin
        //public Users Get(string account, string password)
        //{
        //    return usersService!.GetAll(m => m.Account == account
        //                && m.Password == DataEncrypt.MD5Encrypt(password))
        //        .FirstOrDefault()!;
        //}

        //[HttpPost]//添加  FromBody:规范化标识,告诉服务器是以http请求正文形式发送模式(非URL)
        //public int Post([FromBody] Users users)//对象形参
        //{
        //    users.Password = DataEncrypt.MD5Encrypt(users.Password!);
        //    return usersService!.Add(users);
        //}

        //[HttpPut]//修改
        //public int Put([FromBody] Users users)//对象形参
        //{
        //    return usersService!.Update(users);
        //}

        //[HttpDelete]//删除
        //public int Put(string account)//对象形参
        //{
        //    return usersService!.Remove(account);
        //}
        //特性[]
        //[TypeFilter(typeof(UsersAuthorizeAttribute))]//第一种方式
        //第二种方式
        [HttpGet]
        public async Task<IEnumerable<Users>> Get()//xml json List<Users>
        {
            return await usersService!.GetAllAsync();//结果集List
        }

        [HttpGet("{account}")]
        public async Task<Users> Get(string account)
        {
            return await usersService!.GetAsync(account);
        }

        [HttpPost]//添加  FromBody:规范化标识,告诉服务器是以http请求正文形式发送模式(非URL)
        public async Task<int> Post([FromBody] Users users)//对象形参
        {
            users.Password = DataEncrypt.MD5Encrypt(users.Password!);
            return await usersService!.AddAsync(users);
        }

        [HttpPut]//修改
        public async Task<int> Put([FromBody] Users users)//对象形参
        {
            users.Password = DataEncrypt.MD5Encrypt(users.Password!);
            try
            {
                return await usersService!.UpdateAsync(users);
            }
            catch (Exception)
            {
                return 0;
            }
        }

        [HttpDelete("delete/{account}")]//删除
        public async Task<int> Delete(string account)//对象形参
        {
            return await usersService!.RemoveAsync(account);
        }
    }
}

 Filters/UsersAuthorizeAttribute.cs

using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.Filters;
using ServerSide.Common;

namespace ServerSideApi.Filters
{
    public class UsersAuthorizeAttribute : IAuthorizationFilter
    {
        public void OnAuthorization(AuthorizationFilterContext context)
        {
            string? token = context.HttpContext.Request.Headers["token"];//"" null
            //有没有带Token
            if (string.IsNullOrEmpty(token))
            {
                //进来后直接返回到前端
                context.Result = new JsonResult(0);//文本类型text  没有授权
            }
            else//判断token是否正确
            {
                string? key = RedisCache.GetCache(token);//36位字符串在redis
                if (string.IsNullOrEmpty(token))
                {
                    context.Result = new JsonResult(0);//没有授权
                }
            }
            //没进去,正常进入控制器>动作方法
        }
    }
}

Program.cs

using Microsoft.EntityFrameworkCore;
using ServerSide.BLL;
using ServerSide.DAL;

var builder = WebApplication.CreateBuilder(args);

// Add services to the container.

builder.Services.AddControllers();
// Learn more about configuring Swagger/OpenAPI at https://aka.ms/aspnetcore/swashbuckle
builder.Services.AddEndpointsApiExplorer();
builder.Services.AddSwaggerGen();


//注入业务类
builder.Services.AddScoped(typeof(IRepository<>),typeof(Repository<>));//IOC容器
builder.Services.AddScoped(typeof(IService<>),typeof(Service<>));

//注入EFCore对象
string connStr = builder.Configuration.GetConnectionString("connStr")!;

builder.Services.AddDbContext<EFContext>(options=>options.UseSqlServer(connStr));

//webapi请求方案
builder.Services.AddCors(options => 
{
    options.AddPolicy("AllowAll",
        options=>options.AllowAnyOrigin()
                        .AllowAnyHeader()
                        .AllowAnyMethod()//method:put delete post get restful风格架构
        );
});

//enctype="multpart/form-data" 请求头  token="asdjasdasg123123"
//http://www.baidu.com/product?id=1001  url传参 
//<form ><input type="text" name="username" /></form> 表单传参

var app = builder.Build();

// Configure the HTTP request pipeline.
//if (app.Environment.IsDevelopment())
//{
//    app.UseSwagger();//Swagger工具
//    app.UseSwaggerUI();
//}
app.UseSwagger();
app.UseSwaggerUI(c => 
{
    c.RoutePrefix = "";
    c.SwaggerEndpoint("/swagger/v1/swagger.json", "Test Web Api");
}
);
app.UseCors("AllowAll");//使用跨域方案
app.UseHttpsRedirection();

app.UseAuthorization();

app.MapControllers();

app.Run();

 设置 Swagger UI 为起始页

打开 launchSettings.json 文件
屏蔽以下两行代码

打开 Program.cs 文件
屏蔽原来的环境判断,新增以下代码 

 

app.UseSwagger();
app.UseSwaggerUI(c =>
  {
      c.RoutePrefix = "";
      c.SwaggerEndpoint("/swagger/v1/swagger.json", "ApiHelp V1"); //第二个参数可自定义命名
  });

发布项目

发布项目:右击项目 → 发布

 选择文件夹

 选择文件夹位置,这个位置就是 项目发布后的文件 所在的位置

检查 目标位置 的文件夹是否存在,不然会报错
点击 更多操作→编辑 可根据自己的项目进行设置

 

 设置好后,点击 发布

当输出显示成功即发布成功;若失败会显示具体信息供排查

2、在 IIS 部署

这里就不再阐述了,引用这位博主的文章
如何安装IIS

安装 Hosting Bundle

点击 下载 .NET(Linux、macOS 和 Windows)
下载安装 Hosting Bundle
我这里安装的是 Hosting Bundle 6.0,可根据情况适当更改

安装成功后,打开 IIS →模块 后会在列表看到 AspNetCoreModuleV2

 

 

 右键 应用程序池 添加应用程序池
选择 无托管代码

 

右键 网站 添加网站 

 

点击浏览,则会跳转到 Swagger UI 界面

 

 

3.内网穿透

 打开 控制面板 → 防火墙

 

 

 端口 → 特定本地端口
然后一直按 下一步,最后填写 名称 即可完成

 

 展示效果:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1253888.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

记录华为云服务器(Linux 可视化 宝塔面板)-- Nginx篇

文章目录 配置Nginx服务器1、添加CentOS 7系统的Nginx yum资源库2、安装Nignx服务 设置Nginx安全级别&#xff08;感觉可以先不设置&#xff09;步骤一步骤二如有启发&#xff0c;可点赞收藏哟~ 配置Nginx服务器 1、添加CentOS 7系统的Nginx yum资源库 先安装rpm apt instal…

Linux 中的 ls 命令使用教程

目录 前言 如何运用 ls 命令 1、列出带有所有权的文件和目录 2、获取以人类可读的方式显示的信息 3、列出隐藏文件 4、递归列出文件 5、在使用 ls 时对文件和目录做区分 6、列出指定扩展名的文件 7、基于大小对输出内容排序 8、根据日期和时间排序文件 让我们来总结…

Nginx:配置文件详解

一、Nginx配置文件 main配置段&#xff1a;全局配置 events段&#xff1a;定义event工作模式 http {}&#xff1a;定义http协议配置 支持使用变量&#xff1a; 内置变量&#xff1a;模块会提供内建变脸定义 自定义变量&#xff1a;set var_name value 二、 主…

动态规划学习——斐波那契数列

目录 最长的斐波那契数列子序列的长度 1.题目 2.题目接口 3.解题思路及其代码 最长的斐波那契数列子序列的长度 1.题目 如果序列x_1&#xff0c;X_2&#xff0c;...&#xff0c;x_n 满足下列条件&#xff0c;就说它是斐波那契式的: 1.n > 3 2.对于所有i2 <n&a…

中间件介绍

一、中间件介绍 官方的说法&#xff1a;中间件是一个用来处理Django的请求和响应的框架级别的钩子。它是一个轻量、低级别的插件系统&#xff0c;用于在全局范围内改变Django的输入和输出。每个中间件组件都负责做一些特定的功能。 但是由于其影响的是全局&#xff0c;所以需…

HashMap的实现原;HashMap的工作原理;HashMap存储结构; HashMap 构造函数

文章目录 说一下HashMap的实现原理(非常重要)①HashMap的工作原理HashMap存储结构常用的变量HashMap 构造函数tableSizeFor() put()方法详解hash()计算原理resize() 扩容机制get()方法为什么HashMap链表会形成死循环 HashMap是我们在工作中使用到存储数据特别频繁的数据结构&am…

韵达快递查询,韵达快递单号查询,一键筛选出单号中的退回件

批量查询韵达快递单号的物流信息&#xff0c;并将其中的退回件一键筛选出来。 所需工具&#xff1a; 一个【快递批量查询高手】软件 韵达快递单号若干 操作步骤&#xff1a; 步骤1&#xff1a;运行【快递批量查询高手】软件&#xff0c;第一次使用的朋友记得先注册&#xff…

短期的规划

大方向&#xff1a; 学习编程的前期 大二上学期&#xff1a; 前期追求知识点的广度&#xff1a; 对各类数据结构的了解 熟悉数据库的各类操作&#xff0c;JDBC熟练使用 与此同时&#xff0c;提高写作能力&#xff0c;学习沉淀&#xff0c;提高技术影响力 大二的寒假&…

Java中的异常语法知识居然这么好玩!后悔没有早点学习

学习异常后&#xff0c;发现异常的知识是多么的吸引人&#xff01;不仅可以用来标记错误&#xff0c;还可以自己定义一个异常&#xff0c;用来实现自己想完成的业务逻辑&#xff0c;接下来一起去学习吧 目录 一、异常的概念及体系结构 1.异常的概念 2.异常的体系结构 3.异常…

文章解读与仿真程序复现思路——电网技术EI\CSCD\北大核心《前景导向的主动配电网智能储能软开关规划方法》

这个标题涉及到电力系统中的主动配电网&#xff08;Active Distribution Network&#xff09;以及与之相关的智能储能软开关的规划方法。下面是对标题中各个关键词的解释&#xff1a; 前景导向的&#xff08;Future-oriented&#xff09;&#xff1a; 这表明该方法是以未来发展…

2022年全国硕士研究生入学统一考试管理类专业学位联考数学试题——解析版

文章目录 2022 年全国硕士研究生入学统一考试管理类专业学位联考数学试题一、问题求解&#xff1a;第 1∼15 小题&#xff0c;每小题 3 分&#xff0c;共 45 分。下列每题给出的 A、B、C、D、E 五个选项中&#xff0c;只有一项是符合试题要求的&#xff0c;请在答&#xff0e;题…

strlen和sizeof练习题(以64位机器为例)

例一 一般情况下&#xff0c;数组名表示首元素地址&#xff0c;只有在以下的情况中数组名表示整个数组的地址&#xff1a; 1.sizeof&#xff08;数组名&#xff09;&#xff1a;这里的数组名表示整个数组&#xff0c;计算的是整个数组的大小 2.&数组名&#xff1a;这里的…

五种多目标优化算法(MOPSO、MOAHA、NSGA2、NSGA3、MOGWO)求解微电网多目标优化调度(MATLAB)

一、多目标优化算法简介 &#xff08;1&#xff09;多目标粒子群优化算法MOPSO 多目标应用&#xff1a;基于多目标粒子群优化算法MOPSO求解微电网多目标优化调度&#xff08;MATLAB代码&#xff09;-CSDN博客 &#xff08;2&#xff09;多目标人工蜂鸟算法&#xff08;MOAHA…

C语言进阶之笔试题详解(1)

引言&#xff1a; 对指针知识进行简单的回顾&#xff0c;然后再完成笔试题。 ✨ 猪巴戒&#xff1a;个人主页✨ 所属专栏&#xff1a;《C语言进阶》 &#x1f388;跟着猪巴戒&#xff0c;一起学习C语言&#x1f388; 目录 引言&#xff1a; 知识简单回顾 指针是什么 指针变…

分布式篇---第七篇

系列文章目录 文章目录 系列文章目录前言一、如何将长链接转换成短链接,并发送短信?二、长链接和短链接如何互相转换?三、长链接和短链接的对应关系如何存储?四、如何提高系统的并发能力?前言 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一…

航天宏图——宏图1号样例数据0.5米-5米分辨率(上海部分)

简介&#xff1a; 作为航天宏图“女娲星座”建设计划的首发卫星&#xff0c;航天宏图-1号可获取0.5米-5米的分辨率影像&#xff0c;具备高精度地形测绘、高精度形变检测、高分辨率宽幅成像以及三维立体成像等能力&#xff0c;在自然资源、应急管理、水利等行业与领域具有极高的…

【开源】基于Vue和SpringBoot的数字化社区网格管理系统

项目编号&#xff1a; S 042 &#xff0c;文末获取源码。 \color{red}{项目编号&#xff1a;S042&#xff0c;文末获取源码。} 项目编号&#xff1a;S042&#xff0c;文末获取源码。 目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块三、开发背景四、系统展示五、核心源码5…

LCM-LoRA模型推理简明教程

潜在一致性模型 (LCM) 通常可以通过 2-4 个步骤生成高质量图像&#xff0c;从而可以在几乎实时的设置中使用扩散模型。 来自官方网站&#xff1a; LCM 只需 4,000 个训练步骤&#xff08;约 32 个 A100 GPU 小时&#xff09;即可从任何预训练的稳定扩散 (SD) 中提取出来&#…

【深度学习笔记】03 微积分与自动微分

03 微积分与自动微分 导数和微分导数解释的可视化偏导数梯度链式法则自动微分非标量变量的反向传播分离计算 导数和微分 假设我们有一个函数 f : R → R f: \mathbb{R} \rightarrow \mathbb{R} f:R→R&#xff0c;其输入和输出都是标量。 如果 f f f的导数存在&#xff0c;这个…

按需引入 ElMessage,没有样式且类型检查失败

文章目录 ElMessage 弹框没有样式问题描述解决方案 ts 类型检查失败问题描述解决办法 eslint 检查失败问题描述解决办法 ElMessage 弹框没有样式 问题描述 Element-plus 在使用 ElMessage 消息弹框的时候没有样式&#xff0c;按照官方的按需加载的方式引入的 import { ElMes…