Запустить веб-сайт из основного консольного приложения asp.net - PullRequest
0 голосов
/ 04 июня 2019

У меня есть консольное приложение, которое будет службой, у него есть веб-сайт для настройки службы.

Я создал свой веб-сайт, и когда я запускаю этот проект, он работает нормально.

Я ссылался на свой веб-проект в консольном приложении, и внутри него я использую следующий код для запуска сайта.

    Task.Factory.StartNew(new Action(() => Website.Program.Main(null)), TaskCreationOptions.LongRunning);

мой код в классе программы на сайте

    public class Program
{
    public static void Main(string[] args)
    {
        CreateWebHostBuilder(args).Build().Run();
    }

    public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
        WebHost.CreateDefaultBuilder(args)
            .UseStartup<Startup>()
            .UseUrls("http://0.0.0.0:1234");              
}

У меня проблема с тем, что веб-сайт теперь не может найти файлы css и javascript в wwwRoot, я попытался опубликовать приложение в папке отладки консольного приложения, но это не сработало. если я не публикую, в папке отладки консольного приложения есть только dll-файлы, если я публикую все файлы, которые есть, но представления не могут их найти.

Я использую ~ в представлениях для поиска файлов.

В идеале я хочу, чтобы служба, которая может быть установлена, размещала свой собственный веб-сайт и API без ее отображения на локальных компьютерах IIS или нуждалась в включении IIS через функции Windows.

edit Startup.cs

  public class Startup
{
    public Startup(IConfiguration configuration)
    {
        Configuration = configuration;
    }

    public IConfiguration Configuration { get; }

    // This method gets called by the runtime. Use this method to add services to the container.
    public void ConfigureServices(IServiceCollection services)
    {
        services.Configure<CookiePolicyOptions>(options =>
        {
            // This lambda determines whether user consent for non-essential cookies is needed for a given request.
            options.CheckConsentNeeded = context => true;
            options.MinimumSameSitePolicy = SameSiteMode.None;
        });
        services.AddAuthentication(opt =>
        {
            opt.DefaultChallengeScheme = CookieAuthenticationDefaults.AuthenticationScheme;
            opt.DefaultSignInScheme = CookieAuthenticationDefaults.AuthenticationScheme;
            opt.DefaultAuthenticateScheme = CookieAuthenticationDefaults.AuthenticationScheme;
        }).AddCookie(CookieAuthenticationDefaults.AuthenticationScheme, options =>
        {
            options.Cookie.Name = "TmiginScheme";
            options.LoginPath = "/Account/Login";
            options.LogoutPath = "/Account/Logout";
            options.AccessDeniedPath = "/Home/AccessDenied";
            options.ExpireTimeSpan = TimeSpan.FromDays(14);
            options.SlidingExpiration = true;
        });
        services.AddDistributedMemoryCache();
        services.AddSession();

        services.Configure<SettingsViewModel>(Configuration.GetSection("Settings"));
        services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_2);
    }

    // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
    public void Configure(IApplicationBuilder app, IHostingEnvironment env)
    {
        app.UseSession();
        app.UseAuthentication();

        var cookiePolicyOptions = new CookiePolicyOptions
        {
            MinimumSameSitePolicy = SameSiteMode.Strict,
        };

        app.UseCookiePolicy(cookiePolicyOptions);
        if (env.IsDevelopment())
        {
            app.UseDeveloperExceptionPage();
        }
        else
        {
            app.UseExceptionHandler("/Home/Error");
        }
        app.UseStaticFiles();

    app.UseCookiePolicy();

        app.UseMvc(routes =>
        {
            routes.MapRoute(
                name: "default",
                template: "{controller=Home}/{action=Index}/{id?}");
        });
    }
}

Ответы [ 2 ]

0 голосов
/ 05 июня 2019

В Program.Main, установите текущий каталог в качестве корневого пути содержимого до вызова CreateWebHostBuilder.

Кроме того, эта статья может быть хорошим подходом для размещения вашего веб-сайта ASP.NET Core в службе Windows: Размещение ASP.NET Core в службе Windows

Подробнее

При использовании промежуточного программного обеспечения app.UseStaticFiles() приложение ожидает найти статические файлы в wwwroot (каталог "Web Root" ) по умолчанию .

Но чтобы знать о wwwroot, приложение должно сначала знать свой базовый путь, корневой путь содержимого

, которая

определяет, где ASP.NET Core начинает поиск файлов содержимого, таких как представления MVC

и какие

  • необходимо установить при запуске в службе Windows ( или при порождении в качестве долгосрочной задачи из другой программы )
0 голосов
/ 04 июня 2019

Временное исправление, я публиковал в папку отладки напрямую, мне нужно было опубликовать в папке netcoreapp2.2 с отключенной сборкой бритвы.Это все еще не идеальное решение для публикации сайта в корне консольного приложения, если у кого-то есть более простое развертывание.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...