Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

The configuration file 'appsettings.json' was not found and is not optional

The Azure error is:

.Net Core: Application startup exception: System.IO.FileNotFoundException: The configuration file 'appsettings.json' was not found and is not optional.

So this is a bit vague. I can't seem to nail this down. I'm trying to deploy a .Net Core Web API project to Azure, and I'm getting this error:

:( Oops. 500 Internal Server Error An error occurred while starting the application.

I've deployed plain old .Net WebAPI's and they have worked. I've followed online tutorials and they have worked. But somehow my project is broke. Enabling stdoutLogEnabled on Web.config and looking at the Azure Streaming Logs gives me this:

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.<UseStartup>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.<RealizeService>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. 

Ok, that seems simple. It can't find appsettings.json. Looking at my config ( startup.cs ) it seems very well defined. My Startup looks like this:

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<QuantaContext>(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<IExceptionHandlerFeature>();                     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<IServiceScopeFactory>()           .CreateScope())         {             QuantaContext dbContext = serviceScope.ServiceProvider.GetService<QuantaContext>();             dbContext.Database.Migrate();             QuantaDbInitializer.Initialize(dbContext);         }           app.UseSwagger();         app.UseSwaggerUi();       } } 

This works fine locally. But once we publish to Azure, this fails. I'm at a loss. I've created new .Net core project that deploy to Azure just find. But this one project, that I put all my time into to, seems to fail. I'm about ready to copy and paste code out of the project that fails to run and into a new project, but i'm really curious on what's breaking this.

Any ideas?

EDIT: So my Program.cs was:

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<Startup>()                 .Build();              host.Run();         }     } } 

Edit2: Per Frans, I checked the publishOptions. It was:

"publishOptions": { "include": [   "wwwroot",   "web.config" ] 

I took a publishOptions from a working project and changed it to:

 "publishOptions": {   "include": [     "wwwroot",     "Views",     "Areas/**/Views",     "appsettings.json",     "web.config"   ]   }, 

It still gave a 500 error, but it didn't give a stack trace saying it coulding load appsettings.json. Now it was complaining about a connection to SQL. I noticed that my SQL connection string code is mentioned in a lot of RC1 blog posts. RC2 of .Net Core changed it. So I updated it to:

  "Data": {     "ConnectionStrings": {       "DefaultConnection": "Server=(localdb)\\MSSQLLocalDB;Database=QuantaDb;Trusted_Connection=True;MultipleActiveResultSets=true"     }   }, 

And changed my startup to:

 services.AddDbContext<QuantaContext>(options =>         options.UseSqlServer(Configuration.GetConnectionString("DefaultConnection"),         b => b.MigrationsAssembly("Quanta.API"))); 

Finally, it worked.

I must have followed an older RC1 example and not realized it.

like image 266
Frank Avatar asked Aug 26 '16 03:08

Frank


People also ask

How do I add Appsettings to json?

Add Json File After adding the file, right click on appsettings. json and select properties. Then set “Copy to Ouptut Directory” option to Copy Always. Add few settings to json file, so that you can verify that those settings are loaded.

Where is the Appsettings json file?

appsettings. json is one of the several ways, in which we can provide the configuration values to ASP.NET core application. You will find this file in the root folder of our project. We can also create environment-specific files like appsettings.

How do I get Appsettings json value in startup CS?

Adding the AppSettings.json file Then click Add, then New Item and then choose App Settings File option (shown below) and click Add button. Once the File is created, it will have a DefaultConnection, below that a new AppSettings entry is added.

Do I need to add a JSON file to publish options?

You don't need to add your .json file to publish options. it's just that it is looking for the file at the wrong path. set base path and then add json file and it will work. here, startup constructor is built with with HostingEnviornment and base path is set to the current root path. and it will work!

Where is the JSON file in the SYSTEM32 folder?

The physical path is 'C:\Windows\system32\appsettings.json'. It looks like your executable is expecting the JSON file in the system32 folder.

What is the path of filenotfoundexception?

Exception Info: System.IO.FileNotFoundException: The configuration file 'appsettings.json' was not found and is not optional. The physical path is 'C:\Windows\system32\appsettings.json'. It looks like your executable is expecting the JSON file in the system32 folder.

How to extend a simple application with a JSON provider?

This one provides a JSON provider and is called Microsoft.Extensions.Configuration.Json. We can now extend the simple application above by adding an appsettings.json file and adding in the code to build it. And the appsettings.json looks like this: And the value is retrieved like any other: However, while this looks like it should work, it won’t.


1 Answers

In later .net core versions a *.csproj file is used instead of the project.json file.

You can modify the file to get the desired result by adding:

   <ItemGroup>       <Content Update="appsettings.json">         <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>       </Content>    </ItemGroup> 
like image 93
Jensdc Avatar answered Sep 18 '22 12:09

Jensdc