我正在开发 ASP.NET Core MVC 应用程序,但我的连接字符串有问题。
我的生产服务器上有一个 ASPNETCORE_ENVIRONMENT 变量设置为 Production,我的生产服务器是运行 IIS 的 Windows Server 2012R2。我还在生产服务器上安装了 DotNetCore.1.0.4_1.1.1-WindowsHosting.exe。
在开发过程中,我使用 UserSecrets 来保存我的连接字符串。这工作正常。
对于生产,我希望我的生产服务器上的环境变量中有我的连接字符串,这就是我遇到问题的地方。我怀疑这可能与我构建环境变量的方式有关。
当我尝试在生产环境中访问数据库时,我收到一条错误消息,基本上表明它无法解析连接字符串。
An exception occurred in the database while iterating the results of a query.
System.ArgumentException: Keyword not supported: '"server'.
at System.Data.Common.DbConnectionOptions.ParseInternal(Dictionary`2
parsetable, String connectionString, Boolean buildChain, Dictionary`2 synonyms)
at System.Data.Common.DbConnectionOptions..ctor(String connectionString, Dictionary`2 synonyms)
at System.Data.SqlClient.SqlConnectionString..ctor(String connectionString)
如果我将连接字符串放在 appSettings.json 中,生产服务器就可以正常工作。
因此,这是我的 appSettings.json 文件示例,显示了在生产环境中有效的连接字符串;
{
"ConnectionStrings": {
"TestDb": "Server=TestServer;Database=TestDb;Persist Security Info=True;User ID=TestUser;Password=testpassword;MultipleActiveResultSets=true"
},
...
...
...
}
}
如果我将此 appSettings.json 文件部署到生产环境,它可以正常工作。
在我的 ASP.Net Core 应用程序中,在 Startup.cs 文件中,我有以下内容;
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);
if (env.IsDevelopment())
{
// For more details on using the user secret store see https://go.microsoft.com/fwlink/?LinkID=532709
builder.AddUserSecrets<Startup>();
}
builder.AddEnvironmentVariables();
Configuration = builder.Build();
}
我的理解是最后列出的 builder.add... 具有优先级,因此在我的例子中,如果环境中存在连接字符串,它应该优先于 appsettings 中的任何内容。
因此在生产中,如果我使用以下 appSettings.config 文件;
{
"ConnectionStrings": {
"TestDb": "Placeholder for connection string. Overridden by User Secrets in Development and Environment Variables in Production. "
},
...
...
...
}
}
如果我有一个用于连接字符串的环境变量,那么在该 appsettings.json 文件中为 ConnectionStrings:TestDb 设置什么值并不重要。
下面列出的是我使用的环境变量;
Variable Value
ConnectionStrings:TestDb "Server=TestServer;Database=TestDb;Persist Security Info=True;User ID=TestUser;Password=testpassword;MultipleActiveResultSets=true"
但是,当我使用此设置时,当我尝试访问数据库时出现错误,表明它无法解析连接字符串。
我不得不假设问题出在我在环境变量中指定连接字符串的方式,但是在网上搜索了一段时间之后,我无法找到环境变量值应该是什么样子的示例喜欢。例如,我是否需要在整个字符串周围加上前导和尾随单引号?连接字符串的各个部分是否需要单引号或双引号?
任何帮助,例如在环境变量中定义的正确连接字符串的示例,将不胜感激。
最佳答案
您的连接变量中设置了拼写错误/错误的值。
在您粘贴的输出中可以看到:
Variable Value
ConnectionStrings:TestDb "Server=TestServer;Database=TestDb;Persist Security Info=True;User ID=TestUser;Password=testpassword;MultipleActiveResultSets=true"
这可能是在通过设置变量时发生的
$env:ConnectionStrings:MyDb = """Server=..."""
正确的做法是不加引号。
$env:ConnectionStrings:MyDb = "Server=..."
连接字符串的约定是 SQLCONNSTR_、MYSQLCONNSTR_、SQLAZURECONNSTR_ 和 CUSTOMCONNSTR_,它们被 Azure Web 使用应用程序,但也应该适用于自托管、虚拟机或任何其他云提供商。
因此,如果您有一个名为 CUSTOMCONNSTR_TestDb 的环境变量,它将与在
{
"connectionStrings": {
"TestDb": "..."
}
}
如果在 .UseJsonFile(...) 之后调用 AddEnvironmentVariables(),它也会覆盖其中的值。最后注册为准。
var builder = new ConfigurationBuilder()
.SetBasePath(env.ContentRootPath)
.AddJsonFile("appsettings.json", optional: true, reloadOnChange: true)
.AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: true)
// This one needs to be last
.AddEnvironmentVariables();
您还可以使用其他变量来覆盖配置值。 IIRC。 ASPNETCORE_ 是默认前缀(但您可以在 AddEnvironmentVariables("MY_") 中更改它)。
因此 ASPNETCORE_MySettings 会覆盖 Configuration["MySettings"](或 Configuration.Get("MySettings"))和 ASPNETCORE_My__Settings (在 Linux 上使用 双下划线 作为层级结构,请阅读 : 用于获取配置的位置 - Linux 不允许在变量名称中使用冒号)覆盖 Configuration ["My:Settings"] 与
{
"my": {
"settings": "..."
}
}
除非他们最近改变了。
FWIW:据我所知,环境变量/配置键名称不区分大小写。
关于c# - 如何在环境变量中正确存储连接字符串以供生产 ASP.Net Core MVC 应用程序检索,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44931613/
总的来说,我对ruby还比较陌生,我正在为我正在创建的对象编写一些rspec测试用例。许多测试用例都非常基础,我只是想确保正确填充和返回值。我想知道是否有办法使用循环结构来执行此操作。不必为我要测试的每个方法都设置一个assertEquals。例如:describeitem,"TestingtheItem"doit"willhaveanullvaluetostart"doitem=Item.new#HereIcoulddotheitem.name.shouldbe_nil#thenIcoulddoitem.category.shouldbe_nilendend但我想要一些方法来使用
我有一个字符串input="maybe(thisis|thatwas)some((nice|ugly)(day|night)|(strange(weather|time)))"Ruby中解析该字符串的最佳方法是什么?我的意思是脚本应该能够像这样构建句子:maybethisissomeuglynightmaybethatwassomenicenightmaybethiswassomestrangetime等等,你明白了......我应该一个字符一个字符地读取字符串并构建一个带有堆栈的状态机来存储括号值以供以后计算,还是有更好的方法?也许为此目的准备了一个开箱即用的库?
出于纯粹的兴趣,我很好奇如何按顺序创建PI,而不是在过程结果之后生成数字,而是让数字在过程本身生成时显示。如果是这种情况,那么数字可以自行产生,我可以对以前看到的数字实现垃圾收集,从而创建一个无限系列。结果只是在Pi系列之后每秒生成一个数字。这是我通过互联网筛选的结果:这是流行的计算机友好算法,类机器算法:defarccot(x,unity)xpow=unity/xn=1sign=1sum=0loopdoterm=xpow/nbreakifterm==0sum+=sign*(xpow/n)xpow/=x*xn+=2sign=-signendsumenddefcalc_pi(digits
我的目标是转换表单输入,例如“100兆字节”或“1GB”,并将其转换为我可以存储在数据库中的文件大小(以千字节为单位)。目前,我有这个:defquota_convert@regex=/([0-9]+)(.*)s/@sizes=%w{kilobytemegabytegigabyte}m=self.quota.match(@regex)if@sizes.include?m[2]eval("self.quota=#{m[1]}.#{m[2]}")endend这有效,但前提是输入是倍数(“gigabytes”,而不是“gigabyte”)并且由于使用了eval看起来疯狂不安全。所以,功能正常,
在我的Rails(2.3,Ruby1.8.7)应用程序中,我需要将字符串截断到一定长度。该字符串是unicode,在控制台中运行测试时,例如'א'.length,我意识到返回了双倍长度。我想要一个与编码无关的长度,以便对unicode字符串或latin1编码字符串进行相同的截断。我已经了解了Ruby的大部分unicode资料,但仍然有些一头雾水。应该如何解决这个问题? 最佳答案 Rails有一个返回多字节字符的mb_chars方法。试试unicode_string.mb_chars.slice(0,50)
对于具有离线功能的智能手机应用程序,我正在为Xml文件创建单向文本同步。我希望我的服务器将增量/差异(例如GNU差异补丁)发送到目标设备。这是计划:Time=0Server:hasversion_1ofXmlfile(~800kiB)Client:hasversion_1ofXmlfile(~800kiB)Time=1Server:hasversion_1andversion_2ofXmlfile(each~800kiB)computesdeltaoftheseversions(=patch)(~10kiB)sendspatchtoClient(~10kiBtransferred)Cl
大约一年前,我决定确保每个包含非唯一文本的Flash通知都将从模块中的方法中获取文本。我这样做的最初原因是为了避免一遍又一遍地输入相同的字符串。如果我想更改措辞,我可以在一个地方轻松完成,而且一遍又一遍地重复同一件事而出现拼写错误的可能性也会降低。我最终得到的是这样的:moduleMessagesdefformat_error_messages(errors)errors.map{|attribute,message|"Error:#{attribute.to_s.titleize}#{message}."}enddeferror_message_could_not_find(obje
我试图获取一个长度在1到10之间的字符串,并输出将字符串分解为大小为1、2或3的连续子字符串的所有可能方式。例如:输入:123456将整数分割成单个字符,然后继续查找组合。该代码将返回以下所有数组。[1,2,3,4,5,6][12,3,4,5,6][1,23,4,5,6][1,2,34,5,6][1,2,3,45,6][1,2,3,4,56][12,34,5,6][12,3,45,6][12,3,4,56][1,23,45,6][1,2,34,56][1,23,4,56][12,34,56][123,4,5,6][1,234,5,6][1,2,345,6][1,2,3,456][123
如何在buildr项目中使用Ruby?我在很多不同的项目中使用过Ruby、JRuby、Java和Clojure。我目前正在使用我的标准Ruby开发一个模拟应用程序,我想尝试使用Clojure后端(我确实喜欢功能代码)以及JRubygui和测试套件。我还可以看到在未来的不同项目中使用Scala作为后端。我想我要为我的项目尝试一下buildr(http://buildr.apache.org/),但我注意到buildr似乎没有设置为在项目中使用JRuby代码本身!这看起来有点傻,因为该工具旨在统一通用的JVM语言并且是在ruby中构建的。除了将输出的jar包含在一个独特的、仅限ruby
我正在使用的第三方API的文档状态:"[O]urAPIonlyacceptspaddedBase64encodedstrings."什么是“填充的Base64编码字符串”以及如何在Ruby中生成它们。下面的代码是我第一次尝试创建转换为Base64的JSON格式数据。xa=Base64.encode64(a.to_json) 最佳答案 他们说的padding其实就是Base64本身的一部分。它是末尾的“=”和“==”。Base64将3个字节的数据包编码为4个编码字符。所以如果你的输入数据有长度n和n%3=1=>"=="末尾用于填充n%