从现在开始就开始使用ASP.NET Core,这令人印象深刻。在生成的代码中,(见下文)。我想更改硬编码的连接字符串,以从appsettings.json
文件中获取它。
这显然是不可能的。我还没有找到一个可行(甚至可以构建)的示例。
这是怎么回事? 请帮助
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
if (!optionsBuilder.IsConfigured)
{
#warning To protect potentially sensitive information in your connection string, you should move it out of source code. See http://go.microsoft.com/fwlink/?LinkId=723263 for guidance on storing connection strings.
optionsBuilder.UseSqlServer("Server=xxxxxxx;Database=xxxxx;Trusted_Connection=True;");
}
}
提供的链接在一个区域内解决了问题,但在OnConfiguring
的此处无效。我在做什么错了?
public class Startup
{
public Startup(IConfiguration configuration)
{
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.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_1);
var connection = Configuration.GetConnectionString("ConnectionName");
services.AddDbContext<SurveyContext>(options => options.UseSqlServer(connection));
}
// This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
else
{
app.UseExceptionHandler("/Home/Error");
app.UseHsts();
}
app.UseHttpsRedirection();
app.UseStaticFiles();
app.UseCookiePolicy();
app.UseMvc(routes =>
{
routes.MapRoute(
name: "default",
template: "{controller=Home}/{action=Index}/{id?}");
});
}
}
答案 0 :(得分:1)
在您要访问appsettings.json的地方,
JToken jAppSettings = JToken.Parse(
File.ReadAllText(Path.Combine(Environment.CurrentDirectory,
"appsettings.json")));
现在,由于有了对象,因此可以访问其内容。 让我知道它是否有效。
答案 1 :(得分:1)
在使用Scaffold-DbContext
时,默认情况下,它将您的字符串硬编码到DbContext类中(因此它是开箱即用的)。您需要在启动课程中注册DbContext
才能继续。要进行设置,您可以查看this answer中的说明。
请注意,Configuration
属性直接连接到您的appsettings.json和其他几个位置。您可以在this documentation中了解更多信息。虽然您始终可以使用appsettings.json文件,但通常建议将您的安全机密保存在源代码之外的外部json文件中。在开发过程中,最好的解决方案是使用secret manager。最简单的方法是在Visual Studio上右键单击您的项目,然后选择“管理用户机密”。这将打开一个已经连接到您的Configuration
对象的json文件。
设置完成后,您需要使用依赖注入来访问数据库上下文。
public class HomeController : Controller
{
public HomeController(SurveyContext context)
{
// you can set the context you get here as a property or field
// you can use visual studio's shortcut ctrl + . when the cursor is on "context"
// you can then use the context variable inside your actions
}
}
使用using时,它每次都会创建一个新的连接。使用注入可确保每个请求无论创建多少次都仅创建一个连接。
答案 2 :(得分:1)
通常在.NET Core项目的启动类中,将其注册到ConfigureServices函数中。
public void ConfigureServices(IServiceCollection services)
{
services.AddDbContext<YourContext>(options => options.UseSqlServer(connection));
}
当您处于.NET Core的启动类中时,从appsettings.json中读取值是没有问题的。
您可以在Microsoft上找到更多信息,例如:https://docs.microsoft.com/en-us/ef/core/get-started/aspnetcore/existing-db