天道酬勤,学无止境

How to use |DataDirectory| substitution string in appsettings.json with asp.net core?

I'm new to asp.net core and the task I want to do should be very simple. Using Visual Studio, I'm trying to link a .mdf file to my project as a local database. As I want to make it work for several computers, I need to find the data directory folder path from appsettings.json. Therefore, after some researches, the best way to do that is using the |DataDirectory| substitution string.

The problem is that my website can't reach my mdf file this way and it generates an ArgumentException : "Invalid value for key 'attachdbfilename'". Although I found some topics about this issue, none of these answered to my question.

I've already tried to use the full path to find my file and it worked but as I said, I need to find it from several computers.

Here are Startup.cs and appsettings.json

Startup.cs :

public class Startup
    {
        public Startup(IConfiguration configuration)
        {
            string path = Path.Combine(Directory.GetCurrentDirectory(), "App_Data");
            AppDomain.CurrentDomain.SetData("DataDirectory", path);

            Configuration = configuration;
        }

        public IConfiguration Configuration { get; }

        // 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 => true;
                options.MinimumSameSitePolicy = SameSiteMode.None;
            });

            services.AddDbContext<ApplicationDbContext>(options =>
                options.UseSqlServer(
                    Configuration.GetConnectionString("DefaultConnection")));
            services.AddDefaultIdentity<IdentityUser>()
                .AddEntityFrameworkStores<ApplicationDbContext>();

            services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_1);
        }
        [...]
   }

My connection string, in appsettings.json :

"ConnectionStrings": {
    "DefaultConnection": "Server=(localdb)\\mssqllocaldb;AttachDbFilename=|DataDirectory|\\aspnet-MatrixCalculatorApp-db.mdf;Trusted_Connection=True;MultipleActiveResultSets=true"
  },

If needed, I can also provide the stack trace.

Thank you in advance for your help.

评论

Well, if someone still has the same issue as I had, I just found a solution :

You can simply replace the occurence of a string, with the path of your data folder.

Startup.cs :

string path = Path.Combine(Directory.GetCurrentDirectory(), "App_Data");

            services.AddDbContext<ApplicationDbContext>(options =>
                options.UseSqlServer(
                    Configuration.GetConnectionString("DefaultConnection").Replace("[DataDirectory]", path)));
            services.AddDefaultIdentity<IdentityUser>()

appsettings.json

"DefaultConnection": "Server=(localdb)\\mssqllocaldb;AttachDbFilename=[DataDirectory]\\aspnet-MatrixCalculatorApp-db.mdf;Trusted_Connection=True;MultipleActiveResultSets=true"

I replaced |DataDirectory| with [DataDirectory] to avoid program confusion with the substitution string. But if someone has a better explanation than me, it would be nice to do it.

受限制的 HTML

  • 允许的HTML标签:<a href hreflang> <em> <strong> <cite> <blockquote cite> <code> <ul type> <ol start type> <li> <dl> <dt> <dd> <h2 id> <h3 id> <h4 id> <h5 id> <h6 id>
  • 自动断行和分段。
  • 网页和电子邮件地址自动转换为链接。

相关推荐
  • 使用 github 操作部署时更改 appsettings 中的变量(Change variables in appsettings when deploying with github actions)
    问题 我正在尝试使用 github 操作部署应用程序。 我将我的 azure 帐户链接到我的 github 存储库,并创建了以下操作: name: Build and deploy ASP.Net Core app to Azure Web App - my_app_name on: push: branches: - master jobs: build-and-deploy: runs-on: ubuntu-latest steps: - uses: actions/checkout@master - name: Set up .NET Core uses: actions/setup-dotnet@v1 with: dotnet-version: '3.1.102' - name: Build with dotnet run: dotnet build --configuration Release - name: dotnet publish run: dotnet publish -c Release -o ${{env.DOTNET_ROOT}}/myapp - name: Deploy to Azure Web App uses: azure/webapps-deploy@v1 with: app-name: 'my_app_name' slot-name:
  • VSTS JSON 变量替换与 Azure Key Vault 中的机密(VSTS JSON variable substitution with secrets from Azure Key Vault)
    问题 我正在 Visual Studio Team Services 中进行 Azure 应用服务部署(ASP.NET Core 2.0 Web Api),并且想要替换 appsettings.json 中的一些值,所以我阅读了 https://docs.microsoft.com/en-us /vsts/build-release/tasks/transforms-variable-substitution#jsonvarsubs,但他们讨论了通过将名称与句点 (.) 连接来替换文件嵌套级别中的值。 问题是不能在 Azure Key Vault 中使用句点 (.)。 有谁知道如何使用 Azure Key Vault 中的 Secrets 在 appsettings.json 文件中用嵌套级别替换变量? 回答1 我最终使用“ConnectionStrings--Database”作为 Azure Key Vault 中的密钥。 然后在链接到 Azure Key Vault 的 VSTS (https://docs.microsoft.com/en-us/vsts/build-release/concepts/library/variable-groups) 中添加一个“变量组”。 并添加一个名为 ConnectionStrings.Database 的“进程变量”,其值为“$
  • Azure Functions,如何拥有多个 .json 配置文件(Azure Functions, how to have multiple .json config files)
    问题 所以我写了一个 azure 函数,在本地工作得很好。 我相信这归结为拥有local.setting.json文件。 但是当我将它发布到 azure 时,该功能不起作用,因为它找不到我定义的设置值。 来自 Web 应用程序和控制台驱动的方法,我们将拥有与每个环境相关联的不同配置文件。 我怎样才能让它工作,这样我就可以有多个settings.json文件,例如一个用于 dev、stag 和 prod 环境? 最终结果是使用 octopus deploy 来部署它,但在这一点上,如果我什至不能让它与发布一起工作,那么就没有机会这样做了。 我很困惑为什么这些信息不容易获得,因为假设这是一件常见的事情? 回答1 我希望看到函数以与 asp.net 核心或控制台应用程序相同的方式支持环境特定设置。 与此同时,我正在使用下面的代码,这有点老套(见评论)。 public class Startup : FunctionsStartup { public override void Configure(IFunctionsHostBuilder builder) { // Get the path to the folder that has appsettings.json and other files. // Note that there is a better way to get
  • How to ConfigureServices in Asp.Net core WebAPI from another assembly
    In a microservice environment I need to construct a framework for Contract based testing. I'm currently investigatingh how to isolate a single service from it's external dependencies inorder to execute the Provider tests. What I need to do is: Keep the WebApi project intact Start an instance of the WepApi with some config-differences Mock out selected dependencies My Solution structure is this: Case-Solution/ ├── src/ | ├──Case.Api | └──Case.Application ├── test/ | ├──Case.Api.Unittest | ├──(other tests) | ├──Case.Pact.CunsumerTest | └──Case.Pact.ProviderTest I've read this guide about Pact
  • VSTS JSON variable substitution with secrets from Azure Key Vault
    I'm doing an Azure App Service Deploy (ASP.NET Core 2.0 Web Api) in Visual Studio Team Services and want to replace some values in the appsettings.json so I read https://docs.microsoft.com/en-us/vsts/build-release/tasks/transforms-variable-substitution#jsonvarsubs, but they talk about substituting values in nested levels of the file, by concatenate the names with a period (.). Problem is that you can't use periods (.) in an Azure Key Vault. Does anyone know how to substitute variables with nested levels in an appsettings.json file using Secrets from the Azure Key Vault?
  • 如何从另一个程序集配置 Asp.Net 核心 WebAPI 中的服务(How to ConfigureServices in Asp.Net core WebAPI from another assembly)
    问题 在微服务环境中,我需要为基于契约的测试构建一个框架。 我目前正在研究如何将单个服务与其外部依赖项隔离,以便执行 Provider 测试。 我需要做的是: 保持 WebApi 项目完好无损使用一些配置差异启动 WepApi 的实例模拟选定的依赖项 我的解决方案结构是这样的: Case-Solution/ ├── src/ | ├──Case.Api | └──Case.Application ├── test/ | ├──Case.Api.Unittest | ├──(other tests) | ├──Case.Pact.CunsumerTest | └──Case.Pact.ProviderTest 我已经阅读了有关 dotnet 中 Pact 测试的指南。 着眼于Case.Pace.ProviderTest ,我要开始Case.Api从编程Case.Pact.ProviderTest (和其他虚拟主机提供商的条约它的自我)和替换它的一些依赖。 到目前为止,我得到了这个: public class ProviderApiTests : IDisposable { private string ProviderUri { get; } private string PactServiceUri { get; } private IWebHost
  • 如何从 ASP.NET Core 中的 .json 文件读取 AppSettings 值(How to read AppSettings values from a .json file in ASP.NET Core)
    问题 我在文件 appsettings/Config .json 中设置了我的 AppSettings 数据,如下所示: { "AppSettings": { "token": "1234" } } 我在网上搜索过如何从 .json 文件中读取 AppSettings 值,但我没有得到任何有用的信息。 我试过了: var configuration = new Configuration(); var appSettings = configuration.Get("AppSettings"); // null var token = configuration.Get("token"); // null 我知道使用 ASP.NET 4.0 你可以这样做: System.Configuration.ConfigurationManager.AppSettings["token"]; 但是我如何在 ASP.NET Core 中做到这一点? 回答1 这有些曲折。 我已修改此答案以与ASP.NET Core 2.0保持同步(截至 26/02/2018)。 这主要取自官方文档: 要使用 ASP.NET 应用程序中的设置,建议您仅在应用程序的Startup类中实例化Configuration 。 然后,使用选项模式访问各个设置。 假设我们有一个appsettings.json文件,如下所示:
  • 在 ASP.NET Core 2.1 中加载 appsettings.{envName}.json 文件(Load appsettings.{envName}.json file in ASP.NET Core 2.1)
    问题 在 ASP.NET Core 的早期版本中,我们可以动态添加 appsetting.json 文件,其环境后缀如appsettings.Production.json用于生产环境。 由于结构有点不同,现在似乎配置已加载到类Program 。 但是我们这里没有注入``,所以我自己尝试使用环境变量: public class Program { public static void Main(string[] args) { CreateWebHostBuilder(args).Build().Run(); } public static IWebHostBuilder CreateWebHostBuilder(string[] args) { string envName = Environment.GetEnvironmentVariable("ASPNETCORE_ENVIRONMENT"); string envConfigFile = $"appsettings.{envName}.json"; var config = new ConfigurationBuilder() .SetBasePath(Directory.GetCurrentDirectory()) .AddJsonFile(envConfigFile, optional: true); var
  • 在ASP.NET Core中为开发和发布环境自动设置appsettings.json吗?(Automatically set appsettings.json for dev and release environments in asp.net core?)
    问题 我在appsettings.json为数据库连接字符串,webapi位置之类的东西定义了一些值,这些值对于开发,暂存和实时环境是不同的。 有没有一种方法可以拥有多个appsettings.json文件(例如appsettings.live.json等),并让asp.net应用程序根据运行的构建配置“知道”要使用的文件? 回答1 您可以使用条件编译: public Startup(IHostingEnvironment env) { var builder = new ConfigurationBuilder() .SetBasePath(env.ContentRootPath) .AddJsonFile("appsettings.json", optional: true, reloadOnChange: true) #if SOME_BUILD_FLAG_A .AddJsonFile($"appsettings.flag_a.json", optional: true) #else .AddJsonFile($"appsettings.no_flag_a.json", optional: true) #endif .AddEnvironmentVariables(); this.configuration = builder.Build(); } 回答2
  • Load appsettings.{envName}.json file in ASP.NET Core 2.1
    In prior versions of ASP.NET Core we could dynamically add appsetting.json files with the environment suffix like appsettings.Production.json for production environment. Since the structure is a bit different, it seems that the configuration now got loaded in class Program. But we dont have the `` injected here,so I tried it myself using environment variable: public class Program { public static void Main(string[] args) { CreateWebHostBuilder(args).Build().Run(); } public static IWebHostBuilder CreateWebHostBuilder(string[] args) { string envName = Environment.GetEnvironmentVariable(
  • web.config 中的 ASP.NET 5/EF7 连接字符串?(ASP.NET 5/EF7 connection string in web.config?)
    问题 在 ASP.Net 4.5 中,我可以将我的连接字符串放在web.config中以利用web.config transformations这样我就可以在本地使用开发数据库,​​然后当我发布它时将指向生产数据库。 我现在正在使用 ASP.Net 5 和 EF 7,它们似乎使用config.json文件来存储连接字符串而不是web.config 。 使用这种存储文件的新方法,我无法弄清楚如何执行类似过去的web.config transformations之类的操作。 我如何设置config.json来执行此操作或配置它以便我可以在 web.config 中执行此操作并让 EF 在那里查找字符串? 回答1 web.config转换语法面向数据的 XML 格式。 新配置由一些 JSON 格式的文件组成,可以非常轻松地实现暂存方案。 首先,ASP.NET 支持允许通过使用ASPNET_ENV环境变量或通过在launchSettings.json文件中设置Hosting:Environment来设置目标环境(请参阅项目的Properties文件夹)。 可以在 Visual Studio 的项目属性中修改文件launchSettings.json 。 首先应该选择“个人资料” 并为每个配置文件进行设置。 或者,您可以手动编辑文件Properties\launchSettings.json
  • ConfigurationManager 是否与 ASP.NET 核心的 appsettings.json 一起使用?(Does ConfigurationManager work with ASP.NET core's appsettings.json?)
    问题 我有一个 .NET Standard 库,其中包含我所有的 SQL 相关代码。 它甚至包含一些创建 SQL 连接的代码。 该库需要从应用程序配置文件中读取以获取 SQL 连接字符串。 该库使用典型的ConfigurationManager.ConnectionStrings方法。 现在,我在 .NET Core ASP.NET Web Api 2 应用程序中使用这个库。 我在这个应用程序的appsettings.json文件中定义了我的连接字符串。 连接字符串位于ConnectionStrings字段中,其给定名称与我的 DLL 从上面查找的名称相匹配。 这似乎不起作用。 我的 DLL,从顶部开始,没有从配置文件中找到连接字符串。 ConfigurationManager不能与appsettings.json一起使用吗? 如果没有,我应该如何处理这个? 回答1 ConfigurationManager 不适用于 appsettings.json,而不是 ConfigurationManager,您必须使用 ConfigurationBuilder 类在 startup.cs 文件中添加 json 文件。 1.将以下代码放入appsettings.json "ConnectionStrings": { "connectionstring ": "Data Source=Demo
  • 如何在 ASP.net Core 2 的 appsettings.json 中加密密码?(How do you encrypt a password within appsettings.json for ASP.net Core 2?)
    问题 我想使用我的 appsettings.json 来存储“主密码”。 然后,该主密码将用于打开由这个出色的密码存储包生成的私钥(及其后续的密码存储):https://github.com/neosmart/SecureStore 问题是,我想不出任何加密主密码的方法。 我知道在 .NET 4.5 中,可以执行以下操作: 1) 将您的密码放入 web.config 文件中 2) 运行此脚本:aspnet_regiis.exe -pef appSettings "C:\myfolder" 3)您的密码最终会被加密 - 但您的程序可以安全地读取。 https://www.codeproject.com/Articles/599416/Encrypting-ASP-NET-Application-Settings 我是在以正确的方式解决这个问题还是有更好的做法? 回答1 请记住,不要将机密存储在网站中的主要appsettings.json ,并且通常保存在源代码管理中。 使用文件提供程序将文件定位在服务器上其他位置的某个其他位置。 如果您有权访问 Azure,则可以将机密存储在 Azure Key Vault 而不是appsettings.json 。 考虑到这一点,如果您想使用 JSON 文件,您可以使用网桥或代理类来处理值的解密。 首先,您需要一个类来解密这些值。 为简洁起见
  • ASP.NET Core appsettings.json 更新代码(ASP.NET Core appsettings.json update in code)
    问题 我目前正在使用 asp.net core v1.1 进行项目,在我的 appsettings.json 中,我有: "AppSettings": { "AzureConnectionKey": "***", "AzureContainerName": "**", "NumberOfTicks": 621355968000000000, "NumberOfMiliseconds": 10000, "SelectedPvInstalationIds": [ 13, 137, 126, 121, 68, 29 ], "MaxPvPower": 160, "MaxWindPower": 5745.35 }, 我也有用于存储它们的类: public class AppSettings { public string AzureConnectionKey { get; set; } public string AzureContainerName { get; set; } public long NumberOfTicks { get; set; } public long NumberOfMiliseconds { get; set; } public int[] SelectedPvInstalationIds { get; set; } public decimal
  • 在.NET Core测试项目中读取appsettings json值(Read appsettings json values in .NET Core Test Project)
    问题 我的Web应用程序需要从appsettings.json文件读取Document DB密钥。 我已经创建了一个具有键名的类,并将ConfigureaServices()的Config部分读取为: public Startup(IHostingEnvironment env) { var builder = new ConfigurationBuilder() .AddJsonFile("appsettings.json", optional: true, reloadOnChange: true) .AddEnvironmentVariables(); Configuration = builder.Build(); } public IConfigurationRoot Configuration { get; } public void ConfigureServices(IServiceCollection services) { services.AddMvc().AddJsonOptions(options => options.SerializerSettings.ContractResolver = new DefaultContractResolver()); services.AddSession(); Helpers
  • ASP NET Core 2.0 appsettings.Development.json 不适用于日志记录配置(ASP NET Core 2.0 appsettings.Development.json not working with logging configuration)
    问题 我已经安装了 VS2017 15.3.0 Preview 4 和 .NET Core 2.0 Preview 2 并创建了一个默认的 Web MVC 应用程序。 我有兴趣了解新的日志记录功能如何工作,但在查看调试输出窗口时,我无法让 VS 使用 appsettings.Development.json 中定义的日志记录值。 我的理解是 appsettings.Development.json 文件优先于 appsettings.json 但只有后一个文件中的值对调试窗口有任何影响。 这是正确的吗? 如果是这样,是否需要额外的设置? 以下是数值和结果... 应用设置.json { "Logging": { "IncludeScopes": false, "Debug": { "LogLevel": { "Default": "None" } }, "Console": { "LogLevel": { "Default": "Information" } } } } appsettings.Development.json { "Logging": { "IncludeScopes": false, "LogLevel": { "Default": "Information", "System": "Information", "Microsoft": "Information"
  • ASP NET Core 2.0 appsettings.Development.json not working with logging configuration
    I have installed VS2017 15.3.0 Preview 4 and .NET Core 2.0 Preview 2 and have created a default Web MVC application. I am interested in seeing how the new logging functionality works but I cannot get VS to use the logging values defined in appsettings.Development.json when viewing the Debug output window. My understanding is that the appsettings.Development.json file takes precedence over the appsettings.json yet only values in the latter file has any effect on the debug window. Is this right? If so is there additional setup required? Here are the values and results... appsettings.json {
  • .NET Core控制台应用程序的ASP.NET Core配置(ASP.NET Core configuration for .NET Core console application)
    问题 ASP.NET Core支持一个新的配置系统,如下所示:https://docs.asp.net/en/latest/fundamentals/configuration.html .NET Core控制台应用程序也支持此模型吗? 如果不是,那么可以替代以前的app.config和ConfigurationManager模型吗? 回答1 您可以使用此代码段。 它包括配置和DI。 public class Program { public static ILoggerFactory LoggerFactory; public static IConfigurationRoot Configuration; public static void Main(string[] args) { Console.OutputEncoding = Encoding.UTF8; string environment = Environment.GetEnvironmentVariable("ASPNETCORE_ENVIRONMENT"); if (String.IsNullOrWhiteSpace(environment)) throw new ArgumentNullException("Environment not found in ASPNETCORE_ENVIRONMENT")
  • 如何在另一个项目的上下文中读取 appsettings.json? ASP.NET 核心(How to read appsettings.json in context in another project? Asp.Net Core)
    问题 我需要在两个地方使用相同的ConnectionString 。 在我的 Web 项目Insig.Api ,它包含来自appsettings.json ConnectionString ,在另一个项目类库Insing.Infrastructure ,我的数据库上下文在哪里。 Insig.Api - Startup.cs public class Startup { public IConfiguration Configuration { get; } public Startup(IHostingEnvironment env) { var builder = new ConfigurationBuilder() .SetBasePath(env.ContentRootPath) .AddJsonFile("appsettings.json", optional: false, reloadOnChange: true) .AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: true) .AddEnvironmentVariables(); Configuration = builder.Build(); } public void ConfigureServices
  • ASP.NET Core 2 不从 appsettings 读取端点(ASP.NET Core 2 not reading endpoints from appsettings)
    问题 我正在尝试使用 ASP.NET Core 2.0 通过 appsettings.json 中的设置配置 Kestrel 端点的新方法。 这在 Microsoft Build 2017 活动中得到了展示(在 YouTube 时间框架 21:00-26:20 上查看)。 演讲者说(并演示)以下将在 Kestrel 上配置侦听端口: { "Message": "TEST!!", "Kestrel": { "Endpoints": { "Localhost": { "Address": "127.0.0.1", "Port": "5011" } } } } 但这对我不起作用。 当我使用“dotnet run”时,仍在使用默认端口 5000。 我知道正在加载 appsettings.json 文件,因为我可以在其他地方使用 Message 值。 从 GitHub 上的代码,我看不到任何配置 Kestrel 的地方。 有没有其他人能够让这种方法发挥作用? 我无法理解它在演示中是如何工作的,但在我自己的代码中却无法理解。 回答1 我知道这是不久前被问到的,但我认为发布这个问题是有意义的,因为自从最初提出这个问题以来,ASP.NET Core 框架已得到增强以支持应用程序设置中的 Kestrel 端点配置。 请在下面找到有关如何在 ASP.NET Core 2.1