这里写自定义目录标题
一、前言
记录一次webapi发布过程
服务器 WinowServer2019 DataCenter
开发框架 .net 8.0.2 的webapi
IIS10.0(服务器自带)
因为SQLServer的数据,就没办法不用windows的服务器
二、IIS配置
常规安装就好,我主要是要framework的代码,所以装个4.7
三、创建站点
这里是你windows的登录账户密码
然后完成就好
四、连接池配置
五、配置服务器
下载ASP.NET Core 运行时
https://dotnet.microsoft.com/zh-cn/download/dotnet/8.0
运行时和托管包都要安装。注意与开发环境兼容。
模块里有这个就算安装成功了。
六、运行出报错403.14
微软异常参考文档:https://learn.microsoft.com/zh-cn/aspnet/core/test/troubleshoot-azure-iis?view=aspnetcore-8.0
出了403.14这错误,对比总结,反应过来 项目内目录外的upload上传文件夹没有复制过来。
顺便给个Everyone的权限。防止上传图片没创建目录权限。
七、运行出报错500.30
出了500.30错误 webconfig里的inprocess改成outofprocess
八、运行404 无法打开swagger UI
错误倒是没有了,但是你这给我个404页面,我有点懵啊。
1、改launchSettings.json,注释掉默认的
2、改 Program.cs,将开发改成全局,并制定路径
app.UseSwagger();
app.UseSwaggerUI(c =>
{
c.SwaggerEndpoint("/swagger/v1/swagger.json", "xxApi V1");
c.RoutePrefix = "";
});
这样就能解决404问题了, 刷新IIS站点,预览 http://8.8.8.8:7070/index.html,swaggerUI就出来了,记得做好鉴权哟,我之前的文章也记录过JWT鉴权配置
九、数据无法连接ConnectionStrings为空
我的设置写在app.config里,ODBC连的数据库
上传后,swagger能打开,鉴权能实现,读取数据库却失败。
1、删除app.config
2、将 连接设置写入appsettings.json
3、解析appsettings.json获取ConnectionStrings
public class ConnectionString
{
static IConfiguration _configuration;
static ConnectionString()
{
_configuration = new ConfigurationBuilder().SetBasePath(Directory.GetCurrentDirectory()).AddJsonFile("appsettings.json", true, true).Build();
}
/// <summary>
/// 数据库连接信息
/// </summary>
public static CntConfig DbConfig => _configuration.GetSection("ConnectionStrings").Get<CntConfig>();
}
public class CntConfig
{
public string constr { get; set; }
}
4、将ConnectionStrings用起来,在Program.cs 里赋值给odbc的static 连接字符
问题得到解决。
十、跨域问题,URL重写,反向代理
比如:网站是http://8.8.8.8:8080/ webapi是7070
不同站点8080 request直接访问7070肯定跨域
我们要将8080,反代成7070解决跨域。简单的说看起来是访问的8080,其实内部咱们已经给他换成了7070的地址。
当然更简单的办法,前端、后端和API放到IIS同一个站点下的不同文件夹目录里
1、ARR下载安装:https://www.iis.net/downloads/microsoft/application-request-routing
注意在页底
出现这个图标就表示安装成功了
勾选,应用就可以了
2、配置 反代有两种方法,一种是直接web.config里设置 如:
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<system.webServer>
<rewrite>
<rules>
<rule name="跨域方案">
<match url="api\/?(.*)" />
<conditions>
</conditions>
<action type="Rewrite" url="http://8.8.8.8:7070/api/{R:1}" />
</rule>
</rules>
</rewrite>
</system.webServer>
</configuration>
意思呢,就是说,匹配到“api/”,重写成 “http://8.8.8.8:7070/api/{R:1}”
另外一种,安装rewrite:https://www.iis.net/downloads/microsoft/url-rewrite
保存,应用后,其实也是写到webconfig里的。
十一、webApi静态文件路径设置 失效
补更一个小问题:图片打不开了
我的图片是CS、BS 共用,所以Upload文件,我放在 解决方案内、API之外,结构如下:
Solution
|---Upload
|---Webapi
|---WinForm
|--......
Program.cs我是这样写的。
意思是,访问 Solution/webapi/Upload ,反射到 Solution/Upload 的实际图片路径。
前提描述清楚了,问题就是发布后图片打不开了。
解决:app.Environment.ContentRootPath应该是获取的项目文件路径,将
api发布后文件夹名 改成和 项目API名 一致,得到解决