当将 Asp.Net Core 应用程序作为 Windows 服务运行(使用 .net Core 兼容包)时,您必须获取与正常运行不同的应用程序数据路径。正如这里所描述的,你必须这样做:
string pathToContentRoot = Directory.GetCurrentDirectory();
if (isService) {
string pathToExe = Process.GetCurrentProcess().MainModule.FileName;
pathToContentRoot = Path.GetDirectoryName(pathToExe);
}
Run Code Online (Sandbox Code Playgroud)
并设置 Webhostbuilder 的基本路径(缩短):
IConfigurationRoot config = new ConfigurationBuilder()
.SetBasePath(pathToContentRoot)
.Build();
IWebHost host = WebHost.CreateDefaultBuilder(args)
.UseConfiguration(config)
.UseStartup<Startup>()
.Build();
Run Code Online (Sandbox Code Playgroud)
然而问题是,当您想在ConfigureServices(...) 方法中访问Startup.cs 中的此路径时,我找不到方法来执行此操作。
我尝试过以下事情:
配置服务仅接受 IServiceCollection,因此这是不允许的:
public void ConfigureServices(IServiceCollection services, IHostingEnvironment env) {...}
Run Code Online (Sandbox Code Playgroud)
此时 HostingEnvironment 尚未设置:
public Startup(IHostingEnvironment env) {
HostingEnvironment = env; // <-- is null
}
Run Code Online (Sandbox Code Playgroud)
这里,Content Root 路径是"C:\Windows\System32" …
我正在尝试托管 ASP.net Core WebAPI,就像 Microsoft 文档告诉我的那样:Hosting in ASP.NET Core
我在 Windows Server 2016 上运行 IIS 10,其中安装了 Web Deploy 3.6、.Net Core Runtime 2.0.7 和 .NET Core Server Hosting Bundle。
Web API 配置如下:
程序.cs:
public static IWebHost BuildWebHost(string[] args) {
IConfigurationRoot config = new ConfigurationBuilder()
.SetBasePath(Directory.GetCurrentDirectory())
.AddJsonFile("appsettings.json")
.Build();
return WebHost.CreateDefaultBuilder(args)
.UseConfiguration(config)
.UseStartup<Startup>()
.UseKestrel(opt => {
opt.Listen(IPAddress.Loopback, 4000);
})
.UseIISIntegration()
.Build();
}
Run Code Online (Sandbox Code Playgroud)
网络配置:
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<system.webServer>
<handlers>
<add name="aspNetCore" path="*" verb="*" modules="AspNetCoreModule" resourceType="Unspecified"/>
</handlers>
<aspNetCore processPath="dotnet" arguments=".\Agent.DuZu.Web.dll" stdoutLogEnabled="true" …Run Code Online (Sandbox Code Playgroud)