配置文件'appsettings.json'未找到,且不可选。
配置文件'appsettings.json'未找到,且不可选。
这个Azure错误如下:
.Net Core: 应用程序启动异常:
System.IO.FileNotFoundException: 找不到配置文件\'appsettings.json\'且不是可选的。
所以有点模糊。我似乎无法确定这个问题。我正在尝试将.Net Core Web API项目部署到Azure,但我遇到了这个错误:
🙁 哎呀。500内部服务器错误
启动应用程序时发生错误。
我已经部署了纯粹的旧版.Net WebAPI,它们已经可以使用了。我遵循了在线教程,它们也可以使用。但是我的项目出问题了。在Web.config上启用stdoutLogEnabled并查看Azure Streaming日志,它给出了:
2016-08-26T02:55:12 Welcome, you are now connected to log-streaming service. Application startup exception: System.IO.FileNotFoundException: The configuration file 'appsettings.json' was not found and is not optional. at Microsoft.Extensions.Configuration.FileConfigurationProvider.Load(Boolean reload) at Microsoft.Extensions.Configuration.FileConfigurationProvider.Load() at Microsoft.Extensions.Configuration.ConfigurationRoot..ctor(IList`1 providers) at Microsoft.Extensions.Configuration.ConfigurationBuilder.Build() at Quanta.API.Startup..ctor(IHostingEnvironment env) in D:\Source\Workspaces\Quanta\src\Quanta.API\Startup.cs:line 50 --- End of stack trace from previous location where exception was thrown --- at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw() at Microsoft.Extensions.Internal.ActivatorUtilities.ConstructorMatcher.CreateInstance(IServiceProvider provider) at Microsoft.Extensions.Internal.ActivatorUtilities.CreateInstance(IServiceProvider provider, Type instanceType, Object[] parameters) at Microsoft.Extensions.Internal.ActivatorUtilities.GetServiceOrCreateInstance(IServiceProvider provider, Type type) at Microsoft.Extensions.DependencyInjection.ActivatorUtilities.GetServiceOrCreateInstance(IServiceProvider provider, Type type) at Microsoft.AspNetCore.Hosting.Internal.StartupLoader.LoadMethods(IServiceProvider services, Type startupType, String environmentName) at Microsoft.AspNetCore.Hosting.WebHostBuilderExtensions.<>c__DisplayClass1_0.b__1(IServiceProvider sp) at Microsoft.Extensions.DependencyInjection.ServiceLookup.FactoryService.Invoke(ServiceProvider provider) at Microsoft.Extensions.DependencyInjection.ServiceProvider.ScopedCallSite.Invoke(ServiceProvider provider) at Microsoft.Extensions.DependencyInjection.ServiceProvider.SingletonCallSite.Invoke(ServiceProvider provider) at Microsoft.Extensions.DependencyInjection.ServiceProvider.<>c__DisplayClass12_0.b__0(ServiceProvider provider) at Microsoft.Extensions.DependencyInjection.ServiceProvider.GetService(Type serviceType) at Microsoft.Extensions.DependencyInjection.ServiceProviderServiceExtensions.GetRequiredService(IServiceProvider provider, Type serviceType) at Microsoft.Extensions.DependencyInjection.ServiceProviderServiceExtensions.GetRequiredService[T](IServiceProvider provider) at Microsoft.AspNetCore.Hosting.Internal.WebHost.EnsureStartup() at Microsoft.AspNetCore.Hosting.Internal.WebHost.EnsureApplicationServices() at Microsoft.AspNetCore.Hosting.Internal.WebHost.BuildApplication() Hosting environment: Production Content root path: D:\home\site\wwwroot Now listening on: http://localhost:30261 Application started. Press Ctrl+C to shut down.
好的,这似乎很简单。它找不到appsettings.json。查看我的配置(startup.cs),它似乎非常明确。我的Startup像这样:
public class Startup { private static string _applicationPath = string.Empty; private static string _contentRootPath = string.Empty; public IConfigurationRoot Configuration { get; set; } public Startup(IHostingEnvironment env) { _applicationPath = env.WebRootPath; _contentRootPath = env.ContentRootPath; // Setup configuration sources. var builder = new ConfigurationBuilder() .SetBasePath(_contentRootPath) .AddJsonFile("appsettings.json") .AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: true); if (env.IsDevelopment()) { // This reads the configuration keys from the secret store. // For more details on using the user secret store see http://go.microsoft.com/fwlink/?LinkID=532709 builder.AddUserSecrets(); } builder.AddEnvironmentVariables(); Configuration = builder.Build(); } private string GetXmlCommentsPath() { var app = PlatformServices.Default.Application; return System.IO.Path.Combine(app.ApplicationBasePath, "Quanta.API.xml"); } // This method gets called by the runtime. Use this method to add services to the container. // For more information on how to configure your application, visit http://go.microsoft.com/fwlink/?LinkID=398940 public void ConfigureServices(IServiceCollection services) { var pathToDoc = GetXmlCommentsPath(); services.AddDbContext(options => options.UseSqlServer(Configuration["Data:DefaultConnection:ConnectionString"], b => b.MigrationsAssembly("Quanta.API"))); //Swagger services.AddSwaggerGen(); services.ConfigureSwaggerGen(options => { options.SingleApiVersion(new Info { Version = "v1", Title = "Project Quanta API", Description = "Quant.API", TermsOfService = "None" }); options.IncludeXmlComments(pathToDoc); options.DescribeAllEnumsAsStrings(); }); // Repositories services.AddScoped<ICheckListRepository, CheckListRepository>(); services.AddScoped<ICheckListItemRepository, CheckListItemRepository>(); services.AddScoped<IClientRepository, ClientRepository>(); services.AddScoped<IDocumentRepository, DocumentRepository>(); services.AddScoped<IDocumentTypeRepository, DocumentTypeRepository>(); services.AddScoped<IProjectRepository, ProjectRepository>(); services.AddScoped<IProtocolRepository, ProtocolRepository>(); services.AddScoped<IReviewRecordRepository, ReviewRecordRepository>(); services.AddScoped<IReviewSetRepository, ReviewSetRepository>(); services.AddScoped<ISiteRepository, SiteRepository>(); // Automapper Configuration AutoMapperConfiguration.Configure(); // Enable Cors services.AddCors(); // Add MVC services to the services container. services.AddMvc() .AddJsonOptions(opts => { // Force Camel Case to JSON opts.SerializerSettings.ContractResolver = new CamelCasePropertyNamesContractResolver(); }); } // This method gets called by the runtime. Use this method to configure the HTTP request pipeline. public void Configure(IApplicationBuilder app) { app.UseStaticFiles(); // Add MVC to the request pipeline. app.UseCors(builder => builder.AllowAnyOrigin() .AllowAnyHeader() .AllowAnyMethod()); app.UseExceptionHandler( builder => { builder.Run( async context => { context.Response.StatusCode = (int)HttpStatusCode.InternalServerError; context.Response.Headers.Add("Access-Control-Allow-Origin", "*"); var error = context.Features.Get(); if (error != null) { context.Response.AddApplicationError(error.Error.Message); await context.Response.WriteAsync(error.Error.Message).ConfigureAwait(false); } }); }); app.UseMvc(routes => { routes.MapRoute( name: "default", template: "{controller=Home}/{action=Index}/{id?}"); // Uncomment the following line to add a route for porting Web API 2 controllers. //routes.MapWebApiRoute("DefaultApi", "api/{controller}/{id?}"); }); //Ensure DB is created, and latest migration applied. Then seed. using (var serviceScope = app.ApplicationServices .GetRequiredService() .CreateScope()) { QuantaContext dbContext = serviceScope.ServiceProvider.GetService(); dbContext.Database.Migrate(); QuantaDbInitializer.Initialize(dbContext); } app.UseSwagger(); app.UseSwaggerUi(); } }
本地运行正常。但是一旦发布到Azure,它会失败。我不知所措。我创建了一个新的 .Net Core 项目,可以成功部署到Azure。但是这个项目,我花了很多时间在上面,似乎失败了。我准备将失败的项目中的代码复制并粘贴到新的项目中,但我真的很好奇是什么破坏了它。
有什么想法吗?
编辑:
我看到Program.cs是这样的:
using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Threading.Tasks; using Microsoft.AspNetCore.Hosting; namespace Quanta.API { public class Program { public static void Main(string[] args) { var host = new WebHostBuilder() .UseKestrel() .UseContentRoot(Directory.GetCurrentDirectory()) .UseIISIntegration() .UseStartup() .Build(); host.Run(); } } }
编辑2:
根据Frans的建议,我检查了publishOptions。它是这个:
"publishOptions": { "include": [ "wwwroot", "web.config" ]
我使用了一个可用项目的publishOptions并将其更改为:
"publishOptions": { "include": [ "wwwroot", "Views", "Areas/**/Views", "appsettings.json", "web.config" ] },
它仍然会产生500错误,但是它没有给出堆栈跟踪,说它无法加载appsettings.json。现在它抱怨SQL的连接。我注意到我的SQL连接字符串在许多RC1博客文章中被提到。.Net Core的RC2已经更改了它。因此,我将其更新为:
"Data": { "ConnectionStrings": { "DefaultConnection": "Server=(localdb)\\MSSQLLocalDB;Database=QuantaDb;Trusted_Connection=True;MultipleActiveResultSets=true" } },
并且我把我的启动项目改成了:
services.AddDbContext(options => options.UseSqlServer(Configuration.GetConnectionString("DefaultConnection"), b => b.MigrationsAssembly("Quanta.API")));
最后,它成功了。
我一定是按照旧的 RC1 示例来做的,没有意识到。