C# ASP.NET核心作为Windows服务wwwroot位置

C# ASP.NET核心作为Windows服务wwwroot位置,c#,asp.net-core,dnx,kestrel-http-server,C#,Asp.net Core,Dnx,Kestrel Http Server,我有一个包含ASP.NET核心的windows服务应用程序 project.json有两个逗号: "commands": { "web": "Microsoft.AspNet.Server.Kestrel", "service": "MyAppNamespace" } 入口点类: public class Program : ServiceBase { IApplication _application; public Program(IServiceProv

我有一个包含ASP.NET核心的windows服务应用程序

project.json有两个逗号:

"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();
    }
}
接下来,我从控制台启动我的应用程序

dnx.exe -p "C:\MyProject\approot\src\MyProject" service
但是我们没有使用“C:\MyProject\wwwroot”中的webroot目录,而是使用与project.json相同的目录,即“C:\MyProject\approt\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)
例子 它可能使用
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();
}

我们可以在代码中做同样的事情

你可以发布你的整个project.json文件吗?我还有一个选择。如果我们简单地将wwwroot复制到项目目录,它会工作,但我并不真正喜欢这种方法。
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();
}
public WebHostBuilder()
    : this(config: new ConfigurationBuilder().Build()) { }
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();
}