topshelf+asp.net core webapi(mvc)+swagger部署windows服务
前奏 ,asp.net core mvc+api已经能正常部署IIS使用,由于设置quartz.net job运行,IIS因为存在回收问题(虽然可以部署时设置IIS不回收,但总想找找部署windows服务);所以使用了topshelf 部署调整;
由于程序已经能在IIS上运行,所有autofac都已经完成;参考了网上很多的方案,及topshelf官网,但都不是很明确。处理了很多;验证出可行的方案,记录一下;
换成windows 服务部署 :只需调整 Program.cs的部分即可
原来的program.cs部分
public static void Main(string[] args)
{
CreateHostBuilder(args).Build().Run();
}
public static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.UseServiceProviderFactory(new AutofacServiceProviderFactory())
.ConfigureWebHostDefaults(webBuilder =>
{
webBuilder.UseStartup<Startup>()
.ConfigureLogging((hostingContext, builder) =>
{
//过滤掉系统默认的一些日志
builder.AddFilter("System", LogLevel.Error);
builder.AddFilter("Microsoft", LogLevel.Error);
builder.AddFilter("MediCore.AuthHelper.ApiResponseHandler", LogLevel.Error);
//可配置文件
var path = Path.Combine(Directory.GetCurrentDirectory(), "Log4net.config");
builder.AddLog4Net(path);
})
.UseUrls("http://localhost:8888");
});
}
调整为:
public static void Main(string[] args)
{
var rc = HostFactory.Run(x =>
{
x.Service<MainService>(s =>
{
s.ConstructUsing(name => new MainService(args));
s.WhenStarted(tc => tc.Start());
s.WhenStopped(tc => tc.Stop());
});
x.RunAsLocalSystem();
x.SetDescription("JwtAPIService");
x.SetDisplayName("JwtAPIService");
x.SetServiceName("JwtAPIService");
});
var exitCode = (int)Convert.ChangeType(rc, rc.GetTypeCode());
Environment.ExitCode = exitCode;
// CreateHostBuilder(args).Build().Run();
}
将 hostbuider部分写入调用的MainService中
public class MainService
{
private string[] args;
public MainService(string[] vs)
{
args = vs;
}
public void Start()
{
var isService = !(Debugger.IsAttached || args.Contains("--console"));
//官网实列 public static IWebHostBuilder CreateWebHostBuilder(string[] args) 调整成 CreateHostBuilder
var builder = CreateHostBuilder(args.Where(arg => arg != "--console").ToArray());
//这部分先不考究
if (isService)
{
var pathToExe = Process.GetCurrentProcess().MainModule.FileName;
var pathToContentRoot = Path.GetDirectoryName(pathToExe);
builder.UseContentRoot(pathToContentRoot);
}
var host = builder.Build();
host.Run();
}
public void Stop()
{
}
public static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.UseServiceProviderFactory(new AutofacServiceProviderFactory())
.ConfigureWebHostDefaults(webBuilder =>
{
webBuilder.UseStartup<Startup>()
.ConfigureLogging((hostingContext, builder) =>
{
//过滤掉系统默认的一些日志
builder.AddFilter("System", LogLevel.Error);
builder.AddFilter("Microsoft", LogLevel.Error);
builder.AddFilter("MediCore.AuthHelper.ApiResponseHandler", LogLevel.Error);
//可配置文件
var path = Path.Combine(Directory.GetCurrentDirectory(), "Log4net.config");
builder.AddLog4Net(path);
})
.UseUrls("http://localhost:8888");
});
}
部署:
cmd 带上发布的路径执行exe
安装:MediDemo.exe install
启动:MediDemo.exe start
卸载:MediDemo.exe uninstall
本身集成了swagger
http:localhost:8888/swagger/index.html 可以正常查看,接口也能正常调试

到这里还有一个问题就是,本身程序还是包括mvc后台管理程序,这时候访问mvc部分,样式都没有了,留给后面查证时什么问题,应该时静态类文件加载不上

正常IIS登录时这样的
浙公网安备 33010602011771号