Definindo o caminho base usando o ConfigurationBuilder

89

Estou tentando definir o caminho base do aplicativo para um aplicativo da web .Net que estou construindo. Continuo recebendo erros no construtor de configuração. Este é o erro que recebo.

DNX,Version=v4.5.1 error CS1061: 'ConfigurationBuilder' does not contain a definition for 'SetBasePath' and no extension method 'SetBasePath' accepting a first argument of type 'ConfigurationBuilder' could be found (are you missing a using directive or an assembly reference?)

Presumo que receberei o mesmo erro para meu .AddJsonFile()e .AddEnvironmentVariables(). Fiz algo de errado? Eu não adicionei a dependência certa ao meu project.json? Incluí meu startup.cs e meu project.json.

project.json

{
"version": "1.0.0-*",
"compilationOptions": {
"emitEntryPoint": true
},
"tooling": {
"defaultNamespace": "TripPlanner"
},

"dependencies": {
  "Microsoft.AspNet.StaticFiles":  "1.0.0-rc1-final",
  "Microsoft.AspNet.Server.Kestrel": "1.0.0-rc1-final",
  "Microsoft.AspNet.Mvc": "6.0.0-rc1-final",
  "Microsoft.AspNet.Mvc.TagHelpers": "6.0.0-rc1-final",
  "Microsoft.Framework.Configuration": "1.0.0-beta8",
  "Microsoft.Framework.DependencyInjection": "1.0.0-beta8"
  //"Microsoft.Extensions.PlatformAbstractions": "1.0.0-beta8"
},

"commands": {
  "web": "Microsoft.AspNet.Server.Kestrel"
},

"frameworks": {
  "dnx451": { },
  "dnxcore50": { }
},

"exclude": [
  "wwwroot",
  "node_modules"
],
"publishExclude": [
  "**.user",
  "**.vspscc"
 ]
}

startup.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.AspNet.Builder;
using Microsoft.AspNet.Hosting;
using Microsoft.AspNet.Http;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.PlatformAbstractions;
using Microsoft.Framework.Configuration;
using Microsoft.Framework.DependencyInjection;
using TripPlanner.Services;



namespace TripPlanner
{
  public class Startup
  {
    public static IConfigurationRoot Configuration;

    public Startup(IApplicationEnvironment appEnv){
        var builder = new ConfigurationBuilder()
            .SetBasePath(appEnv.ApplicationBasePath)
            .AddJsonFile("config.json")
            .AddEnvironmentVariables();

        Configuration = builder.Build();
    }

    // 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(Microsoft.Extensions.DependencyInjection.IServiceCollection services)
    {
        services.AddMvc();
        #if DEBUG
        services.AddScoped<IMailService, DebugMailService> ();
        #else
        services.AddScoped<IMailService, RealMailService> ();
        #endif
    }

    // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
    public void Configure(IApplicationBuilder app)
    {
       //app.UseDefaultFiles();
       app.UseStaticFiles();
       app.UseMvc(config =>
       {
           config.MapRoute(
               name: "Default",
               template: "{controller}/{action}/{id?}",
               defaults: new { controller  = "App", action = "Index"}
           );
       });

    }

    // Entry point for the application.
    public static void Main(string[] args) => Microsoft.AspNet.Hosting.WebApplication.Run<Startup>(args);
  }
}

O erro está na public startupfunção próxima ao topo de startup.cs.

currymanswag
fonte

Respostas:

172

Consegui resolver o problema. Se você ainda não resolveu, tente o seguinte no project.json. Adicione o seguinte:

"Microsoft.Extensions.Configuration.FileExtensions": "1.0.0-*",
"Microsoft.Extensions.Configuration.Json": "1.0.0-rc2-final"

e deve funcionar

Fouad Zakka
fonte
Como faço isso no EF Core 2.0, já que agora não há nenhum arquivo project.json?
ATHER
3
@ATHER: basta adicionar os dois nugets da mesma forma que adiciona quaisquer outros nugets.
Dejan
5
@ATHER dotnet add package <packageName>onde packageName neste caso é Microsoft.Extensions.Configuration.FileExtensions, ou no Visual Studio adicionar pacote nuget
William Ardila
49

Não tenho certeza se alguém ainda tem esse problema, mas consegui resolver isso em um projeto de console dotnetcore (netcoreapp2.0) por meio de:

dotnet add package Microsoft.Extensions.Configuration.Json
Bispo
fonte
1
Obrigado @bishop. Adicionar isso à minha biblioteca principal .net resolveu meu problema.
Wallace B. McClure
Sim, a instalação do .Jsonatravés do NuGet também funciona.
James Hirschorn
6

Tente adicionar o seguinte em seu .csprojarquivo:

<ItemGroup>
    <PackageReference Include="Microsoft.Extensions.Configuration" Version="2.2.0" />
    <PackageReference Include="Microsoft.Extensions.Configuration.FileExtensions" Version="2.2.0" />
    <PackageReference Include="Microsoft.Extensions.Configuration.Json" Version="2.2.0" />
</ItemGroup>
Vijay Shaaruck
fonte
Microsoft.Extensions.Configuration.FileExtensions e Microsoft.Extensions.Configuration.Json são exatamente os pacotes que estão faltando.
Ognyan Dimitrov
3

Se você estiver executando um .NET Core 1.x ou .NET Standard 1.x , deverá executar este comando:

dotnet add package Microsoft.Extensions.Configuration.Json -v 1.1.1

Se o seu projeto estiver dentro de outra pasta:

dotnet add .\src\MyProject package Microsoft.Extensions.Configuration.Json -v 1.1.1

... onde MyProject é o nome do .csprojarquivo.

Alisson
fonte
3

Continuando com mais um possível problema ...

Eu tive que adicionar isto:

<PackageReference Include="Microsoft.Extensions.Configuration.UserSecrets" Version="3.0.0" />

para compilar:

var builder = new ConfigurationBuilder()
  .SetBasePath(Directory.GetCurrentDirectory())
  ...

Edit: Escrevi esta resposta há vários meses, mas tenho certeza de que era para um aplicativo de console.

Fonte
fonte
1
Funcionou como um encanto!
Daniel Cohen
2

Adicione o seguinte ao seu project.json:

"Microsoft.Extensions.Configuration.FileExtensions": "1.0.0-*"
dudu
fonte
2

Tente adicionar o seguinte às suas dependências project.json: "Microsoft.Extensions.Configuration.CommandLine": "1.1.1",

Ou em project.csproj:
<PackageReference Include="Microsoft.Extensions.Configuration.CommandLine" Version="1.1.1" />

Isso funcionou para mim.

Pritesh Dhokchaule
fonte
1

Tente adicionar o seguinte às suas dependências project.json:

"Microsoft.Extensions.Configuration": "1.0.0-*",
"Microsoft.Extensions.Configuration.Abstractions": "1.0.0-*",
Brett Christensen
fonte
Obrigado pela sugestão! Tentei adicionar ambos ao project.json e então fiz um "dnu restore". Mas ainda estou recebendo o mesmo erro no meu Startup.cs. Alguma outra ideia? Encontrei a documentação para a função exata que estou usando aqui . SetBasePath()
currymanswag
0

Além disso, não se esqueça de definir a propriedade "Copiar para diretório de saída" como "Copiar sempre" do arquivo Json na janela Propriedades.

emert117
fonte
0

Outra coisa a considerar:

using Microsoft.Extensions.Configuration;

Sem essa instrução "usando", ele não encontra o método de extensão em Microsoft.Extensions.Configuration.FileExtensions.

O problema surgiu para mim porque também estávamos:

using System.Configuration;

E houve um conflito de nomes com "ConfigurationBuilder". Adicione o

using Microsoft.Extensions.Configuration;

linha ... remova o

using System.Configuration;

linha, em seguida, qualificar totalmente qualquer coisa em System.Configuration.

Chad Lehman
fonte