繁体   English   中英

ASP.NET Core作为Windows服务wwwroot的位置

[英]ASP.NET Core as Windows service wwwroot location

我有一个包含ASP .NET Core的Windows服务应用程序

project.json具有2个逗号:

"commands": {
    "web": "Microsoft.AspNet.Server.Kestrel",
    "service": "MyAppNamespace"
}

入口点类:

public class Program : ServiceBase
{
    IApplication _application;

    public Program(IServiceProvider serviceProvider)
    {

    }

    public void Main(string[] args)
    {
        Run(this);
    }

    protected override void OnStart(string[] args)
    {
        var configProvider = new MemoryConfigurationProvider();
        configProvider.Add("server.urls", "http://*:80");

        var config = new ConfigurationBuilder()
            .Add(configProvider)
            .AddEnvironmentVariables()
            .Build();

        _application = new WebHostBuilder(config)
            .UseServer("Microsoft.AspNet.Server.Kestrel")
            .UseStartup<Startup>()
            .Build()
            .Start();

        // my stuff bellow
    }

    protected override void OnStop()
    {
        _application?.Dispose();
    }
}

发布项目后,我们具有以下文件夹结构:

approot
logs
wwwroot

接下来,我从控制台启动我的应用程序

dnx.exe -p "C:\MyProject\approot\src\MyProject" service

但是我们没有使用“ C:\\ MyProject \\ wwwroot”中的webroot目录,而是使用了project.json,即“ C:\\ MyProject \\ approot \\ src \\ MyProject”

如果我通过“ web”命令启动应用程序,如下所示:

dnx.exe -p "C:\MyProject\approot\src\MyProject" web

然后所有的一切都应该工作,但是当然我的入口点被忽略了,我无法执行我的东西,也不能作为服务运行

project.json

{
  "version": "1.0.0-*",

  "dependencies": {
    "MicroORM": "1.0.7",
    "Microsoft.ApplicationInsights.AspNet": "1.0.0-rc1",
    "Microsoft.AspNet.Diagnostics": "1.0.0-rc1-final",
    "Microsoft.AspNet.IISPlatformHandler": "1.0.0-rc1-final",
    "Microsoft.AspNet.Mvc": "6.0.0-rc1-final",
    "Microsoft.AspNet.Mvc.TagHelpers": "6.0.0-rc1-final",
    "Microsoft.AspNet.Server.Kestrel": "1.0.0-rc1-final",
    "Microsoft.AspNet.StaticFiles": "1.0.0-rc1-final",
    "Microsoft.AspNet.Tooling.Razor": "1.0.0-rc1-final",
    "Microsoft.Extensions.Configuration": "1.0.0-rc1-final",
    "Microsoft.Extensions.Configuration.FileProviderExtensions": "1.0.0-rc1-final",
    "Microsoft.Extensions.Configuration.Json": "1.0.0-rc1-final",
    "Microsoft.Extensions.Logging": "1.0.0-rc1-final",
    "Microsoft.Extensions.Logging.Console": "1.0.0-rc1-final",
    "Microsoft.Extensions.Logging.Debug": "1.0.0-rc1-final",
    "Microsoft.VisualStudio.Web.BrowserLink.Loader": "14.0.0-rc1-final",
    "Microsoft.AspNet.Authentication.Cookies": "1.0.0-rc1-final",
    "Npgsql": "3.0.5",
    "ObjectPool": "1.0.0"
  },

  "commands": {
    "web": "Microsoft.AspNet.Server.Kestrel --server.urls=http://*:80",
    "service": "MikroBill"
  },

  "frameworks": {
    "dnx46": {
      "frameworkAssemblies": {
        "System.Data": "4.0.0.0",
        "System.ServiceProcess": "4.0.0.0"
      }
    }
  },

  "exclude": [
    "wwwroot",
    "node_modules"
  ],
  "publishExclude": [
    "**.user",
    "**.vspscc"
  ],
  "scripts": {
    "prepublish": [ "npm install", "bower install", "gulp clean", "gulp min" ]
  }
}

简短的答案

我们可以将webroot密钥添加到我们的MemoryConfigurationProvider

configProvider.Add("webroot", "relative-path-to-web-root");

或者我们可以向ConfigurationBuilder注册我们的hosting.json文件:

config.AddJsonFile("hosting.json", optional: true)

protected override void OnStart(string[] args)
{
    var configProvider = new MemoryConfigurationProvider();
    configProvider.Add("server.urls", "http://localhost:5000");
    configProvider.Add("webroot", "./../../../my-root");

    var config = new ConfigurationBuilder()
        .Add(configProvider)
        .AddJsonFile("hosting.json", optional: true)
        .Build();

    _application = new WebHostBuilder(config)
        .UseServer("Microsoft.AspNet.Server.Kestrel")
        .UseStartup<Program>()
        .Build()
        .Start();
}

更长的答案

当我们将ConfigurationBuilder传递到WebHostBuilder构造函数时,我们将不再免费获得默认设置。 这是空的WebHostBuilder构造函数。

public WebHostBuilder()
    : this(config: new ConfigurationBuilder().Build()) { }

它可能使用WebHostConfiguration.GetDefault方法,它增加了hosting.json文件给我们。

public static IConfiguration GetDefault(string[] args)
{
    // code omitted for clarity

    var configBuilder = new ConfigurationBuilder()
        .AddInMemoryCollection(defaultSettings)
        .AddJsonFile(WebHostDefaults.HostingJsonFile, optional: true)
        .AddEnvironmentVariables(prefix:
           WebHostDefaults.EnvironmentVariablesPrefix);

    // code omitted for clarity

    return configBuilder.Build();
}

我们可以在代码中做同样的事情。 这是一个很好的示例。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM