目标
将控制台程序改成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上时,就会发生这个问题.此时,只要将这两个目录的包,对应的复制到目标机器上就可以了