Веб-приложение .net core 2.1 работает в Visual Studio, но не работает при развертывании в IIS в Windows 10 - PullRequest
0 голосов
/ 28 февраля 2019

Я новичок в разработке ядра .net и пытаюсь развернуть веб-приложение .net core 2.1 в IIS в Windows 10. Я выполнил все шаги, включая создание пула приложений «No Managed Code», и все работало нормально.Спустя 2 дня он перестал работать, затем я повторно развернул свой проект, используя тип выпуска Debug, и здесь я получаю это исключение, отображаемое в браузере, который совпадает с файлом журнала.Error while browsing the web app

Однако это же приложение отлично работает в visual studio.На моей машине установлены следующие .net пакеты..Net Core Runtme 2.1.7 (x64) .Net Core 2.1.7 - хостинг Windows Server .NET Core Runtime 2.1.7 (x86) .Net Core SDK 2.1.503 (x86) .Net Core SDK 2.1.503 (x64)Microsoft Web Deploy 4.0

После просмотра всех доступных статей, настройки и изменения приложение, наконец, заработало, но позже оно перестало работать и выдало вышеуказанную ошибку.My Startup.cs

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

    public IConfiguration Configuration { get; set; }

    // 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 => false;
            options.MinimumSameSitePolicy = SameSiteMode.None;

        });

        services.Configure<DataProtectionTokenProviderOptions>(o =>
        {
            o.Name = "Default";
            o.TokenLifespan = TimeSpan.FromHours(1);
        });


        services.AddDbContext<ApplicationDbContext>(options =>
        options.UseMySql(Configuration.GetConnectionString("DefaultConnection"),
        mysqloptions => {
            mysqloptions.ServerVersion(new Version(8, 0, 13), ServerType.MySql);
        }));

        services.AddTransient<IProductRepository, EFProductRepository>();

        services.AddScoped<Cart>(sp => SessionCart.GetCart(sp));
        services.AddSingleton<IHttpContextAccessor, HttpContextAccessor>();
        services.AddIdentity<ApplicationUser, IdentityRole>(
            options =>
            {
                options.Stores.MaxLengthForKeys = 128;
                options.Tokens.PasswordResetTokenProvider = TokenOptions.DefaultAuthenticatorProvider;
                options.SignIn.RequireConfirmedEmail = false;
                options.Password.RequireDigit = false;
                options.Password.RequireNonAlphanumeric = false;
                options.Password.RequireUppercase = false;
            }

            )
              .AddEntityFrameworkStores<ApplicationDbContext>()
              .AddRoleManager<RoleManager<IdentityRole>>()
              .AddRoles<IdentityRole>()
           //.AddDefaultUI();
           .AddDefaultTokenProviders();

        //Authentication







        services.AddDbContext<MainContext>(options =>
      options.UseMySql(Configuration.GetConnectionString("ModelConnectionString"),

       mysqloptions => {
           mysqloptions.ServerVersion(new Version(8, 0, 13), ServerType.MySql);
           mysqloptions.MigrationsAssembly("GasStationApp");
       }));






        services.AddScoped<IUserClaimsPrincipalFactory<ApplicationUser>, MyUserClaimsPrincipalFactory>();


        services.AddMvc().AddNToastNotifyToastr(new ToastrOptions()
        {
            ProgressBar = false,
            PositionClass = ToastPositions.TopFullWidth

        }
        );



        services.Configure<IISOptions>(options => {
            options.AutomaticAuthentication = false;
            options.ForwardClientCertificate = false;

});

My Program.cs

public class Program
{
    public static int Main(string[] args)
    {
        Log.Logger = new LoggerConfiguration()
            .MinimumLevel.Debug()
            .MinimumLevel.Override("Microsoft", LogEventLevel.Information)
            .Enrich.FromLogContext()
            .WriteTo.RollingFile("logs/log-{Date}.txt")
            .CreateLogger();

        try
        {
            Log.Information("Starting web host");
            BuildWebHost(args).Run();
            return 0;
        }
        catch (Exception ex)
        {
            Log.Fatal(ex, "Host terminated unexpectedly");
            return 1;
        }
        finally
        {
            Log.CloseAndFlush();
        }



    }



    public static IWebHost BuildWebHost(string[] args) =>
      WebHost.CreateDefaultBuilder(args)
        .UseKestrel()
        .ConfigureAppConfiguration((builderContext, config) =>
        {
            config.AddJsonFile("appsettings.json", optional: false);
        })
        .UseContentRoot(Directory.GetCurrentDirectory())
        .UseIISIntegration()
      .UseStartup<Startup>()
          .UseSerilog() // <-- Add this line
          .Build();

}

Приложение отлично работает в VS2017, но не работает при развертывании в IIS вWindows 10 Пожалуйста, помогите мне решить эту проблему.Любые советы будут полезны.Заранее спасибо.

Ответы [ 2 ]

0 голосов
/ 28 февраля 2019

Файлы appsettings.json и appsettings.{environment}.json.ASP.NET Core использует переменную среды (ASPNETCORE_ENVIRONMENT), чтобы определить, какие конфигурации загружать.По умолчанию это значение равно Development в Visual Studio, что, конечно, вызывает использование appsettings.Development.json.Когда вы публикуете свое приложение, вам следует установить переменную окружения ASPNETCORE_ENVIRONMENT в месте назначения на Production, что приведет к использованию appsettings.Production.json.(Я не помню, имеет ли значение регистр, хотя это может произойти, особенно в случае файловых систем, чувствительных к регистру, таких как те, что используются в Linux и Mac OS. Лучше всего просто убедиться, что файл имеет имя appsettings.Production.json, на всякий случай.)

Кроме того, зависящий от среды файл JSON переопределяет неопределенный.Другими словами, сначала читается appsettings.json, а затем читается appsettings.{environment}.json. Все, что указано в appsettings.json, заданном также в версии для конкретной среды, будет переопределено этим значением в версии для конкретной среды.

Короче, шаблон должен быть таким.Любая конфигурация, не относящаяся к конкретной среде, должна входить в appsettings.json.Любая конфигурация, относящаяся к среде, должна входить в соответствующие файлы конфигурации для конкретной среды.Я считаю хорошей практикой помещать заполнители для специфичных для среды и секретных значений конфигурации в appsettings.json.Например:

 "ConnectionStrings": {
     "DefaultConnection": "[CONNECTION STRING]"
 }

Из-за того, что конфиг наложен на себя, а поскольку appsettings.json загружается первым, вы можете указать фактическое значение в любой другой форме конфига (среды).- специфический JSON, переменные среды, пользовательские секреты, хранилище ключей Azure и т. д.).Затем он документирует все настройки вашего приложения в одном месте с четким указанием того, что на самом деле необходимо предоставить.

0 голосов
/ 28 февраля 2019

Это довольно странно, у развернутых файлов есть три appsettings.json, appsettings.development.json, appsettings.production.json.Мне не удалось разобраться в этом, потому что я думал, что файл appsettings.json по умолчанию должен иметь исходную конфигурацию, но оказалось, что appsettings.json и appsettings.development.json в развернутой папке имеют только настройки по умолчанию, которые были доступны, когда высоздайте проект веб-приложения в VS 2017. Файл appsettings.production.json имеет исходную конфигурацию.Решение.Скопировал файл appsettings.production.json и переименовал его в appsettings.json, и теперь веб-приложение работает нормально.enter image description here

...