目标
将控制台程序改成 web 程序, 通过 IIS 反向代理, 处理请求
环境
win10 / .net core 2.1 / centos7
变成 Web 程序
1. 在新建的 ASP.NET core 控制台程序中添加
- Microsoft.AspNetCore.Server.IISIntegration // 这个用于 IIS 反向代理
- Microsoft.AspNetCore.Server.Kestrel // 这个是 ASP.NET core 的服务器, 由于跨平台, 所以不能再使用 IIS 了, 以前的 ASP.NET, 可以利用 IIS 提供的便利
- // 这个用于添加 "中间件", 是处理请求用. ASP.NET core 和 ASP.NET 完全不同了, ASP.NET 管道有十几个事件, 注册这些事件就能在请求的不同阶段作出处理.
- // 但这个方案并不是最佳的, 因为这些事件相当于是一种具体实现, 它肯定不能很好的贴合各种形式的要求.
- // ASP.NET core 通过注册中间件的方式, 相当于由自己定制处理事件, 自定义个数和顺序. 这个明显是一种更上层的抽象. 更加的灵活
- Microsoft.AspNetCore.Hosting
2. 在 Main 方法里初始化 kestrel 服务器
- // 程序运行后, 开启一个 Web 程序,
- new WebHostBuilder()
- // 使用这个服务器来运行这个 Web 程序. kestrel 是默认的 ASP.NET core 服务器.
- .UseKestrel()
- // 为 IIS 反向代理提供支持 反向代理是指服务器 RP 接到请求后, 将请求通过 HTTP 请求转发给和它在一个局域网内的其它服务器, RP 自己并不处理请求, 只是转发
- .UseIISIntegration()
- // 这个是注册中间件, 也就是加处理程序的地方, Startup 类里必要有这个 Configure 方法
- .UseStartup<Startup>()
- // 建立并运行这个 Web 服务
- .Build()
- .Run();
- // 约定叫这个 Startup 名字, 当然也可是其它的. 主要是这个类里要有 Configure 方法, 它注册了所谓中间件
- class Startup
- {
- public void Configure(IApplicationBuilder App)
- {
- // 这个类里只注册了一个中间件, 就是处理静态文件的中间件
- // 要使用这个方法, 需要引用 Microsoft.AspNetCore.StaticFiles 这个包
- App.UseStaticFiles();
- // 这个处理方法, 接收到非静态文件请求, 返回这句话
- App.Run(context => context.Response.WriteAsync("Hello World 这是处理程序返回的内容"));
- }
- }
3. 到此, 运行这个程序, 出现控制台窗口, 显示 Web 服务器运行了
默认监听的地址是: Http://localhost:5000 在浏览器中打开, 成功的话, 显示 Hello World
默认情况下, Web 应用程序目录是当前程序所在目录, Web 静态文件目录是当前程序目录下的 wwwroot 目录.
可以在程序目录下, 新建一个 wwwroot 目录, 放入一个静态 html 文件, 浏览器中就可查看到.
IIS 反向代理
上面的测试都是直接访问 kestrel 服务器, 然而在 Windows 上接收请求的最佳选择仍然是 IIS 服务器. ASP.NET core 教程上, 也是要求将 kestrel 放在 IIS 之后处理请求, 而由 IIS 接收请求, 以保护服务器
需要做一些配置后, 可以让 IIS 反向代理 ASP.NET CORE 程序
一. 下载 ASP.NET core 的 IIS 支持组件 dotnet-hosting-2.1.5-win.exe 下载地址 https://www.microsoft.com.NET/download 在页面中选择 Download .Net Core Runtime 这个, 下载之后安装, IIS 模块会多一个
二. 新建一个站点, 目录指向 ASP.NET core 程序的运行目录. 将站点的应用程序池设为无托管应用程序
三. 站点的模块和映射最小需要两个模块和两个映射 静态文件, ASP.NET core 映射, asp.netcore 模块和匿名验证模块
四. Web.config
ASP.NET core 并不需要这个文件, 由于挂 IIS 托管反向. 所以这个文件用于 IIS, 它也放在 ASP.NET core 程序运行目录下. 其中最重要的配置节为
- <aspNetCore processPath="dotnet"
- arguments="Web.dll"
- stdoutLogEnabled="true"
- stdoutLogFile="./">
- </aspNetCore>
processPath 表示使用 dotnet 命令, 运行这个 Web 程序. 只要架设好 IIS 后, 不需要手动启动 ASP.NET core 程序, 通过这个命令, 在 iis 启动网站后, ASP.NET core 程序就会启动
arguments 表示 ASP.NET Web 应用程序的那个可执行文件
后面两个可以记录日志, 在调试时, 日志会记录出错的地方. 比如 ASP.NET core 程序没有运行起来. 出错日志会记录在程序运行目录下.
五. 遇到的错误
刚开始使用反向代理 IIS 转到 UseKestrel 后. 发现无法运行出现 502.3 错误,
查看日志发现可能是权限不足, 导致程序无法执行某些库.
研究后发现, 将用到的软件包目录添加上相应权限即可. users 组, 这个用户添加到目录上, 读取和执行权限.
在 win10 系统上, aspnetcore 的软件包位置默认有两处
一处在于
C:\Users \ 当前用户目录下 \.nuget 这个文件夹下, 这个是 Nuget 包的总目录, 必须有执行权限
二处在于
C:\Program Files\dotnet 这个目录下, 这个是 dotnet 命令的目录, 另外, nuget 包的依赖包, 也在这个目录下, C:\Program Files\dotnet\sdk\NuGetFallbackFolder
Linux 下运行
上面两个路径下装了程序运行需要的所有库, 如果运行时报缺少库, 基本上就是这两个地方的问题
NuGetFallbackFolder 这个目录比较重要, 如果发现 nuget 包运行失败缺少依赖项, 则应检查这个目录下就没有这个包的依赖项存在. 一般来讲,
通过 VS 的 nuget 包管理器下载的包, 是没有这个问题的.
当程序部署到其它机器如 Linux 上时, 就会发生这个问题. 此时, 只要将这两个目录的包, 对应的复制到目标机器上就可以了
来源: http://www.bubuko.com/infodetail-2803769.html