2016-03-17 5 views
1

У меня есть приложение окна-сервис, содержащий ASP .NET СердечникASP.NET ядро, как Windows, служба Wwwroot расположения

project.json имеет 2 commans: класс

"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 

Но вместо того, чтобы использовать каталог WebRoot из "C: \ MyProject \ Wwwroot" мы имеем такой же, как project.json т.е. «C: \ MyProject \ approot \ SRC \ MyProject»

Если я запустить приложение с помощью„веб“команды, как это:

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" ] 
    } 
} 
+0

Не могли бы вы разместить весь файл project.json. –

ответ

2

Более короткий ответ

Мы можем добавить ключ webroot к нашему MemoryConfigurationProvider:

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

Или мы можем зарегистрировать наш файл hosting.json с ConfigurationBuilder:

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(); 
} 

Longer Ответ

Когда мы проходим 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(); 
} 

Мы можем сделать то же самое в нашем коде. Here is a sample for good measure.

+1

ничего не изменилось – Miles

+0

У меня есть еще один вариант. Если мы просто скопируем wwwroot в каталог проекта, это сработает, но мне не очень нравится этот подход. – Miles

+0

Не могли бы вы показать мне, как это сделать? :) – Miles

Смежные вопросы