旭翔汽车蓄电池 發表於 2025-5-8 09:36:46

.Net8 WebAPI项目创建部署的实现

<div id="navCategory"><h5 class="catalogue">目录</h5><ul class="first_class_ul"><li><a href="#_label0">1、创建项目</a></li><li><a href="#_label1">2、项目结构和解释</a></li><li><a href="#_label2">3、本地运行</a></li><li><a href="#_label3">4、生成项目</a></li><li><a href="#_label4">5、服务器远程部署(Windows)</a></li><ul class="second_class_ul"><li><a href="#_lab2_4_0">(1)安装IIS</a></li><li><a href="#_lab2_4_1">(2)安装NetCore运行时</a></li><li><a href="#_lab2_4_2">(3)配置IIS</a></li></ul><li><a href="#_label5">6、新增自定义接口</a></li><ul class="second_class_ul"></ul></ul></div><p>本着学新不学旧的原则,.Net Core会逐步替代.Net Framework,并且是开源框架,能用在什么地方懂的都懂。本文记录了Net8框架下的Web API项目创建到部署过程。</p>
<p class="maodian"><a name="_label0"></a></p><h2>1、创建项目</h2>
<p>新建项目选择ASP.NET Core Web API,太多了的话可以在上面筛选</p>
<p>如果没有去VS Installer添加&ldquo;ASP.NET 和 Web开发&rdquo;模块并安装。</p>
<p style="text-align:center"><img alt="安装" src="https://img.jbzj.com/file_images/article/202505/202505080930131.png" /></p>
<p style="text-align:center"><img alt="创建项目" src="https://img.jbzj.com/file_images/article/202505/202505080930132.png" /></p>
<p><strong>配置项目</strong></p>
<blockquote><p>配置HTTPS:方便测试不勾选。<br />不使用顶级语句:勾选后是传统的Program类中定义Main函数入口;不勾选直接就是指令有点抽象不符合C#习惯,够不够选看个人。<br />使用控制器:不勾选会在Program中写方法,看着乱,建议勾选。</p></blockquote>
<p style="text-align:center"><img alt="项目配置" src="https://img.jbzj.com/file_images/article/202505/202505080930133.png" /></p>
<p class="maodian"><a name="_label1"></a></p><h2>2、项目结构和解释</h2>
<p><strong>项目结构</strong></p>
<p style="text-align:center"><img alt="项目结构" src="https://img.jbzj.com/file_images/article/202505/202505080930134.png" /></p>
<p>Main函数配置解释:</p>
<div class="jb51code"><pre class="brush:csharp;">namespace WebAPI记录
{
    public class Program
    {
      public static void Main(string[] args)
      {
            var builder = WebApplication.CreateBuilder(args);

            // Add services to the container.

            builder.Services.AddControllers();

            //注入swagger
            // Learn more about configuring Swagger/OpenAPI at https://aka.ms/aspnetcore/swashbuckle
            builder.Services.AddEndpointsApiExplorer(); //生成文档
            builder.Services.AddSwaggerGen();   //设置文档内容

            var app = builder.Build();

            // Configure the HTTP request pipeline.
            if (app.Environment.IsDevelopment())    //只有当程序处于debug的情况才开启swagger
            {
                //分别注入中间件和ui中间间
                app.UseSwagger();
                app.UseSwaggerUI();
            }

            app.UseAuthorization();


            app.MapControllers();

            app.Run();
      }
    }
}
</pre></div>
<p>Controller解释:</p>
<div class="jb51code"><pre class="brush:csharp;">using Microsoft.AspNetCore.Mvc;

namespace WebAPI记录.Controllers
{
   
    ")]
    public class WeatherForecastController : ControllerBase
    {
      private static readonly string[] Summaries = new[]
      {
            "Freezing", "Bracing", "Chilly", "Cool", "Mild", "Warm", "Balmy", "Hot", "Sweltering", "Scorching"
      };

      private readonly ILogger&lt;WeatherForecastController&gt; _logger;

      public WeatherForecastController(ILogger&lt;WeatherForecastController&gt; logger)
      {
            _logger = logger;
      }

                // http://ip:port/WeatherForecast
              // 创建Get请求
      public IEnumerable&lt;WeatherForecast&gt; Get()
      {
            return Enumerable.Range(1, 5).Select(index =&gt; new WeatherForecast
            {
                Date = DateOnly.FromDateTime(DateTime.Now.AddDays(index)),
                TemperatureC = Random.Shared.Next(-20, 55),
                Summary = Summaries
            })
            .ToArray();
      }
    }
}
.ToArray();
      }
    }
}
</pre></div>
<p>LaunchSettings.json配置文件:</p>
<p>记录了端口配置信息等。</p>
<div class="jb51code"><pre class="brush:json;">{
"$schema": "http://json.schemastore.org/launchsettings.json",
"iisSettings": {
    "windowsAuthentication": false,
    "anonymousAuthentication": true,
    "iisExpress": {
      "applicationUrl": "http://localhost:12692",
      "sslPort": 0
    }
},
"profiles": {
    "http": {
      "commandName": "Project",
      "dotnetRunMessages": true,
      "launchBrowser": true,
      "launchUrl": "swagger",
      "applicationUrl": "http://localhost:5053",
      "environmentVariables": {
      "ASPNETCORE_ENVIRONMENT": "Development"
      }
    },
    "IIS Express": {
      "commandName": "IISExpress",
      "launchBrowser": true,
      "launchUrl": "swagger",
      "environmentVariables": {
      "ASPNETCORE_ENVIRONMENT": "Development"
      }
    }
}
}
</pre></div>
<p class="maodian"><a name="_label2"></a></p><h2>3、本地运行</h2>
<p>可以选择http或者IIS方式运行,端口见上面json内的配置</p>
<p style="text-align:center"><img alt="运行方式" src="https://img.jbzj.com/file_images/article/202505/202505080930135.png" /></p>
<p><strong>运行效果</strong></p>
<p>Debug模式下会进入Swagger页面(见上面Main函数注释),以UI形式方便观察测试接口和结果</p>
<p style="text-align:center"><img alt="Swagger" src="https://img.jbzj.com/file_images/article/202505/202505080930146.png" /></p>
<p style="text-align:center"><img alt="Swagger" src="https://img.jbzj.com/file_images/article/202505/202505080930147.png" /></p>
<p>点击Execute查看请求URL和返回结果</p>
<p style="text-align:center"><img alt="本地测试" src="https://img.jbzj.com/file_images/article/202505/202505080930148.png" /></p>
<p>至此本地测试完成</p>
<p class="maodian"><a name="_label3"></a></p><h2>4、生成项目</h2>
<p>选择菜单栏中的 生成 -&gt; 发布。</p>
<p>目标可以选文件夹,简单一点</p>
<p style="text-align:center"><img alt="发布" src="https://img.jbzj.com/file_images/article/202505/202505080930149.png" /></p>
<p>默认路径是生成文件夹下的publish目录</p>
<p style="text-align:center"><img alt="发布" src="https://img.jbzj.com/file_images/article/202505/2025050809301410.png" /></p>
<p>点击发布编译生成项目</p>
<p style="text-align:center"><img alt="发布" src="https://img.jbzj.com/file_images/article/202505/2025050809301411.png" /></p>
<p style="text-align:center"><img alt="编译" src="https://img.jbzj.com/file_images/article/202505/2025050809301412.png" /></p>
<p>生成成功后可以直接到生成目录下:</p>
<p style="text-align:center"><img alt="生成" src="https://img.jbzj.com/file_images/article/202505/2025050809301413.png" /></p>
<p class="maodian"><a name="_label4"></a></p><h2>5、服务器远程部署(Windows)</h2>
<p>部署环境:Window Server 2016</p>
<p class="maodian"><a name="_lab2_4_0"></a></p><h3>(1)安装IIS</h3>
<p>这边简单写了,详细自行查询</p>
<p>服务器管理器 -&gt; 添加功能 -&gt; 安装IIS</p>
<p class="maodian"><a name="_lab2_4_1"></a></p><h3>(2)安装NetCore运行时</h3>
<p>进入微软官网下载运行时<a href="https://dotnet.microsoft.com/zh-cn/download/dotnet/8.0" rel="external nofollow" target="_blank">Download .NET 8.0 (Linux, macOS, and Windows)</a>,选择HostBundle包即可。</p>
<p style="text-align:center"><img alt="NETCore" src="https://img.jbzj.com/file_images/article/202505/2025050809301414.png" /></p>
<p>安装完后,右键找到IIS管理器:</p>
<p style="text-align:center"><img alt="IIS" src="https://img.jbzj.com/file_images/article/202505/2025050809301415.png" /></p>
<p>在模块下出现AspNetCoreModuleV2表示安装成功:</p>
<p style="text-align:center"><img alt="在这里插入图片描述" src="https://img.jbzj.com/file_images/article/202505/2025050809301416.png" /></p>
<p style="text-align:center"><img alt="在这里插入图片描述" src="https://img.jbzj.com/file_images/article/202505/2025050809301517.png" /></p>
<p class="maodian"><a name="_lab2_4_2"></a></p><h3>(3)配置IIS</h3>
<p>添加应用程序池:</p>
<p style="text-align:center"><img alt="应用程序池" src="https://img.jbzj.com/file_images/article/202505/2025050809301518.png" /></p>
<p>输入名称,选择&rdquo;无托管代码&ldquo;:</p>
<p style="text-align:center"><img alt="应用程序池" src="https://img.jbzj.com/file_images/article/202505/2025050809301519.png" /></p>
<p>将发布生成的文件夹传到服务器上去,过程略。</p>
<p>IIS添加网站:</p>
<blockquote><p>应用程序池选择刚才创建的<br />物理路径选择刚才上传的文件夹<br />绑定的端口选择空端口(不用和项目中json配置的一样)</p></blockquote>
<p style="text-align:center"><img alt="添加网站" src="https://img.jbzj.com/file_images/article/202505/2025050809301520.png" /></p>
<p>编辑权限中创建一个完全控制权限的账户</p>
<p style="text-align:center"><img alt="创建用户权限" src="https://img.jbzj.com/file_images/article/202505/2025050809301521.png" /></p>
<p>点击&rdquo;启动&ldquo;运行,发现什么都没有。别忘记我们做的是API不是网站,地址换成接口URL就有了</p>
<p style="text-align:center"><img alt="测试结果" src="https://img.jbzj.com/file_images/article/202505/2025050809301522.png" /></p>
<p style="text-align:center"><img alt="测试结果" src="https://img.jbzj.com/file_images/article/202505/2025050809301523.png" /></p>
<p>Postman远程测试也没有问题:</p>
<p style="text-align:center"><img alt="POSTMAN测试" src="https://img.jbzj.com/file_images/article/202505/2025050809301524.png" /></p>
<p class="maodian"><a name="_label5"></a></p><h2>6、新增自定义接口</h2>
<p>Controllers文件夹添加控制器</p>
<p style="text-align:center"><img alt="新增控制器" src="https://img.jbzj.com/file_images/article/202505/2025050809301525.png" /></p>
<p style="text-align:center"><img alt="新增控制器" src="https://img.jbzj.com/file_images/article/202505/2025050809301526.png" /></p>
<p>命名方式注意以Controller结尾</p>
<p style="text-align:center"><img alt="新增控制器" src="https://img.jbzj.com/file_images/article/202505/2025050809301527.png" /></p>
<p>创建好后代码自动继承Controller。</p>
<p><code>&rdquo;)]</code>表示URL以类名MyAPI为路由地址,希望其他地址直接改字符串就行。</p>
<p>列举了4个请求的例子:</p>
<div class="jb51code"><pre class="brush:csharp;">using Microsoft.AspNetCore.Mvc;

namespace WebAPI记录.Controllers
{
   
    ")]
    public class MyAPIController : Controller
    {
      // http://ip:port
      
      public string GetString()
      {
            return "Hello";
      }

      // http://ip:port/myapi/id
      
      public string GetStringByID(int id) // FromHeader属性表示从请求头获得参数
      {
            return "Hello " + id.ToString();
      }

      // http://ip:port/myapi/result
      
      public IActionResult GetStringResult()
      {
            var data = new { Message = "Hello" };
            return Ok(data);    // Ok返回包含请求数据的HTTP 200
      }

      // http://ip:port/postdata
      
      public IActionResult PostData( DataModel data)    // FromBody属性表示从请求的Body中读取并转为DataModel类
      {
            // 在这里处理接收到的数据
            return CreatedAtAction(nameof(PostData), null, new { Message = data }); // CreatedAtAction返回包含创建资源的 URL 的 HTTP 201 响应
      }
    }
}
</pre></div>
<p>DataModel类:</p>
<div class="jb51code"><pre class="brush:csharp;">namespace WebAPI记录
{
    public class DataModel
    {
      public string Name { get; set; }
      public int Value { get; set; }
    }
}
</pre></div>
<p>运行后已经可以访问结果了</p>
<p style="text-align:center"><img alt="运行结果" src="https://img.jbzj.com/file_images/article/202505/2025050809301628.png" /></p>
<p>测试结果:</p>
<p style="text-align:center"><img alt="测试结果" src="https://img.jbzj.com/file_images/article/202505/2025050809301629.png" /></p>
<p style="text-align:center"><img alt="测试结果" src="https://img.jbzj.com/file_images/article/202505/2025050809301630.png" /></p>
<p style="text-align:center"><img alt="测试结果" src="https://img.jbzj.com/file_images/article/202505/2025050809301631.png" /></p>
頁: [1]
查看完整版本: .Net8 WebAPI项目创建部署的实现