.net core 2.1 Web应用程序可在Visual Studio中使用,但在Windows 10中部署到IIS时无法使用

时间:2019-02-28 11:45:47

标签: c# iis asp.net-core web-deployment asp.net-core-2.1

我是.net核心开发的新手,我正在尝试将Web应用程序.net core 2.1部署到Windows 10中的IIS。我遵循了所有步骤,包括创建applicationpool'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

浏览完所有可用文章并进行调整和更改后,该应用程序终于可以使用了,但后来它停止工作并给出了以上错误。 我的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;

});

我的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中运行良好,但在Windows 10中部署到IIS时无法运行。请帮助我解决此问题。任何意见将是有益的。预先感谢。

2 个答案:

答案 0 :(得分:0)

有点奇怪,部署的文件具有三个appsettings.json,appsettings.development.json,appsettings.production.json。我未能对此进行调查,因为我认为默认的appsettings.json文件应具有原始配置,但事实证明,已部署文件夹中的appsettings.json和appsettings.development.json仅具有当您使用时可用的默认设置。在VS 2017中创建一个Web应用程序项目。appsettings.production.json文件具有原始配置。 解。 复制了appsettings.production.json文件,并将其重命名为appsettings.json,Web应用程序现在可以正常工作了。 enter image description here

答案 1 :(得分:0)

文件为appsettings.jsonappsettings.{environment}.json。 ASP.NET Core依靠环境变量(ASPNETCORE_ENVIRONMENT)来确定要加载的配置。默认情况下,在Visual Studio中将其设置为Development,这当然会导致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是首先要加载的内容,因此您可以采用其他任何形式的config(特定于环境的JSON,环境变量,用户机密,Azure密钥保管库等)。然后,它将所有应用程序的配置记录在一个地方,并清楚指示实际需要提供什么。