Establecer la ruta base mediante ConfigurationBuilder

90

Estoy tratando de establecer la ruta base de la aplicación para una aplicación web .Net que estoy creando. Sigo recibiendo errores en el generador de configuraciones. Este es el error que obtengo.

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?)

Supongo que obtendré el mismo error para mi .AddJsonFile()y .AddEnvironmentVariables(). ¿Hice algo mal? ¿No agregué la dependencia correcta a mi project.json? Adjunté mi startup.cs y mi 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);
  }
}

El error está en la public startupfunción que se encuentra cerca de la parte superior de startup.cs.

currymanswag
fuente

Respuestas:

177

Pude resolver el problema. Si aún no lo ha resuelto, intente lo siguiente en project.json. Agregue lo siguiente:

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

y debería funcionar

Fouad Zakka
fuente
¿Cómo hacer esto en EF Core 2.0 ya que ahora no hay un archivo project.json?
ATHER
3
@ATHER: simplemente agregue los dos nugets de la misma manera que agrega cualquier otro nugets.
Dejan
5
@ATHER dotnet add package <packageName>donde packageName en este caso es Microsoft.Extensions.Configuration.FileExtensions, o en Visual Studio agregue el paquete nuget
William Ardila
53

No estoy seguro de si alguien todavía se encuentra con este problema, pero pude solucionarlo en un proyecto de consola dotnetcore (netcoreapp2.0) a través de:

dotnet add package Microsoft.Extensions.Configuration.Json
obispo
fuente
1
Gracias @bishop. Agregar eso en mi biblioteca central .net resolvió mi problema.
Wallace B. McClure
Sí, la instalación a .Jsontravés de NuGet también funciona.
James Hirschorn
6

Intente agregar lo siguiente en su .csprojarchivo:

<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
fuente
Microsoft.Extensions.Configuration.FileExtensions y Microsoft.Extensions.Configuration.Json son exactamente los paquetes que faltan.
Ognyan Dimitrov
3

Si tu eres la ejecución de un 1.x .NET Core o 1.x NET estándar , se debe ejecutar este comando:

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

Si su proyecto está dentro de otra carpeta:

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

... donde MyProject es el nombre del .csprojarchivo.

Alisson
fuente
3

Solo seguimos con un problema más posible ...

Tuve que agregar esto:

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

para que esto se compile:

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

Editar: escribí esta respuesta hace varios meses, pero estoy bastante seguro de que era para una aplicación de consola.

Fuente
fuente
1
¡Trabajado como un encanto!
Daniel Cohen
2

Agregue lo siguiente a su project.json:

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

Intente agregar lo siguiente a sus dependencias project.json: "Microsoft.Extensions.Configuration.CommandLine": "1.1.1",

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

Esto funcionó para mí.

Pritesh Dhokchaule
fuente
1

Intente agregar lo siguiente a sus dependencias project.json:

"Microsoft.Extensions.Configuration": "1.0.0-*",
"Microsoft.Extensions.Configuration.Abstractions": "1.0.0-*",
Brett Christensen
fuente
¡Gracias por la sugerencia! Intenté agregar ambos al project.json y luego hice una "restauración de dnu". Pero sigo recibiendo el mismo error en mi Startup.cs. ¿Alguna otra idea? Encontré la documentación para la función exacta que estoy usando aquí . SetBasePath()
currymanswag
0

Además, no olvide establecer la propiedad "Copiar al directorio de salida" en "Copiar siempre" del archivo Json desde la ventana Propiedades.

emert117
fuente
0

Algo más a considerar:

using Microsoft.Extensions.Configuration;

Sin esa declaración de "uso", no encuentra el método de extensión en Microsoft.Extensions.Configuration.FileExtensions.

El problema surgió para mí porque también estábamos:

using System.Configuration;

Y hubo un choque de nombres con "ConfigurationBuilder". Añade el

using Microsoft.Extensions.Configuration;

línea ... quitar el

using System.Configuration;

línea, luego califique completamente cualquier cosa en System.Configuration.

Chad Lehman
fuente