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

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.内网穿透

 打开 控制面板 → 防火墙

 

 

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

 

 展示效果:

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

STM32_8(DMA)

一、DMA DMA&#xff08;Direct Memory Access&#xff09;直接存储器存取DMA可以提供外设和存储器或者存储器和存储器之间的高速数据传输&#xff0c;无须CPU干预&#xff0c;节省了CPU的资源12个独立可配置的通道&#xff1a; DMA1&#xff08;7个通道&#xff09;&#xff…

RedLock底层源码分析

RedLock底层源码分析 一、Redlock红锁算法 https://redis.io/docs/manual/patterns/distributed-locks/官网说明 1、为什么要学习这个&#xff1f;怎么产生的&#xff1f; ​ 一个很直接的问题&#xff0c;当我使用redis锁的那台机器挂了&#xff0c;出现了单点故障了&#…

hdlbits系列verilog解答(exams/m2014_q4i)-45

文章目录 一、问题描述二、verilog源码三、仿真结果 一、问题描述 实现以下电路&#xff1a; 二、verilog源码 module top_module (output out);assign out 1b0;endmodule三、仿真结果 转载请注明出处&#xff01;

计算机网络常考计算题之循环冗余校验(宝典教学)

文章目录 奇偶效验循环冗余校验例题四步走另一种题型 本文讲述了计算机考研中易出现的循环冗余校验&#xff0c;点赞关注收藏不迷路哦 我是一名双非计算机本科生&#xff0c;希望我的文章可以帮助到你。 奇偶效验 奇偶校验&#xff1a;也可以检测数据在传输过程中是否出现错误…

聚簇索引和非聚簇索引的区别;什么是回表

聚簇索引和非聚簇索引的区别 什么是聚簇索引&#xff1f;&#xff08;重点&#xff09; 聚簇索引就是将数据(一行一行的数据)跟索引结构放到一块&#xff0c;InnoDB存储引擎使用的就是聚簇索引&#xff1b; 注意点&#xff1a; 1、InnoDB使用的是聚簇索引&#xff08;聚簇索…

MySQL日期函数sysdate()与now()的区别,获取当前时间,日期相关函数

select sleep(2) as datetime union all select sysdate() -- sysdate() 返回的时间是当前的系统时间&#xff0c;而 now() 返回的是当前的会话时间。 union all select now() -- 等价于 localtime,localtime(),localtimestamp,localtimestamp(),current_timestamp,curre…

(附源码)SSM环卫人员管理平台 计算机毕设36412

目 录 摘要 1 绪论 1.1背景及意义 1.2国内外研究概况 1.3研究内容 1.4 ssm框架介绍 1.5论文结构与章节安排 2 环卫人员管理平台系统分析 2.1 可行性分析 2.2 系统流程分析 2.2.1数据增加流程 2.2.2数据修改流程 2.2.3数据删除流程 2.3 系统功能分析 2.3.1 功能性…

Kotlin学习——kt中的类,数据类 枚举类 密封类,以及对象

Kotlin 是一门现代但已成熟的编程语言&#xff0c;旨在让开发人员更幸福快乐。 它简洁、安全、可与 Java 及其他语言互操作&#xff0c;并提供了多种方式在多个平台间复用代码&#xff0c;以实现高效编程。 https://play.kotlinlang.org/byExample/01_introduction/02_Functio…

为什么网上大量程序员卡35岁年龄招聘,而从来不报道测试、技术支持、售前售后工程师呢?

其实&#xff0c;网上只报道程序员卡35岁&#xff0c;这个说法并不成立。 而是普遍卡35岁&#xff0c;但并没有明确的一个职业类别。 随便搜一下&#xff0c;一眼望过去&#xff0c;其实已经波及很多行业了。 但如果你把IT从业人员合并报道&#xff0c;确实容易给人一种“程序…

如何在 Vim 中剪切、复制和粘贴

目录 前言 如何在 Vim 编辑器中复制文本 如何在 Vim 编辑器中剪切文本 如何在 Vim 编辑器中粘贴文本 如何通过选择文本来剪切和复制文本 通过选择文本复制 在 Vim 中选择文本来剪切文本 前言 在本篇 Vim 快速技巧中&#xff0c;你将学习到剪切和复制粘贴的相关知识。 剪…

qt5.15.2及6.0以上版本安装

文章目录 下载在线安装器安装打开软件 下载在线安装器 因为从qt5.15开始不支持离线下载安装了&#xff0c;只能通过在线安装的方式进行安装。 下载在线安装下载器&#xff1a; 这个在线安装下载器网上也都是可以找到。 这里是其放到网盘上的下载地址&#xff1a; 链接&#x…

使用Python的turtle库绘制随机生成的雪花

1.1引言 在这篇文章中&#xff0c;我们将使用Python的turtle库来绘制一个具有分支结构的雪花。该程序使用循环和随机颜色选择来绘制20个不同大小和颜色的雪花。turtle库是一个流行的绘图库&#xff0c;常用于创建图形用户界面和简单的动画。这个代码实现了一个有趣的应用&…

美国季节性干旱数据集

美国季节性干旱数据集 美国干旱展望栅格数据集由国家气象局气候预测中心生成。它在每个月的最后一天发布&#xff0c;提供下个月的干旱前景信息。“美国季节性干旱展望”数据集每月发布一次&#xff0c;特别是每月的第三个星期四。该数据集对美国不同地区发生干旱的可能性进行…

Ceph----RBD块存储的使用:详细实践过程实战版

RBD 方式的 工作 流程&#xff1a; 1、客户端创建一个pool&#xff0c;并指定pg数量&#xff0c;创建 rbd 设备并map 到文件系统&#xff1b; 2、用户写入数据&#xff0c;ceph进行对数据切块&#xff0c;每个块的大小默认为 4M&#xff0c;每个 块名字是 object序号&#xff…

C#,《小白学程序》第二十四课:大数的阶乘(BigInteger Factorial)算法与源程序

1 文本格式 /// <summary> /// 《小白学程序》第二十四课&#xff1a;大数&#xff08;BigInteger&#xff09;的阶乘 /// 用于大数的阶乘算法&#xff08;原始算法&#xff09; /// </summary> /// <param name"a"></param> /// <retur…

AIGC创作系统ChatGPT网站源码、支持最新GPT-4-Turbo模型、GPT-4图片对话能力+搭建部署教程

一、AI创作系统 SparkAi创作系统是基于ChatGPT进行开发的Ai智能问答系统和Midjourney绘画系统&#xff0c;支持OpenAI-GPT全模型国内AI全模型。本期针对源码系统整体测试下来非常完美&#xff0c;可以说SparkAi是目前国内一款的ChatGPT对接OpenAI软件系统。那么如何搭建部署AI…

文件属性和路径

文件属性 我们先补充一个知识&#xff1a; 任何新建的文件刚开始都是在磁盘上的 假设我们在文件夹中新建一个1.txt文本文档&#xff0c;他的大小是0KB&#xff0c;但是不能说明这个文件不占用磁盘空间 文件由 文件属性文件内容 组成&#xff0c;这里只能说明文件内容是空 文件…

WorkPlus稳定服务助力行业千万用户,打造无界沟通协作平台

在企业移动数字化领域&#xff0c;WorkPlus以其十年如一日的研发实力和千万级用户案例&#xff0c;成为众多企业首选的移动数字化平台。究竟是什么样的力量支撑着WorkPlus在市场上占据如此重要的地位呢&#xff1f;接下来&#xff0c;让我们一起揭开WorkPlus的神秘面纱&#xf…

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

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