与on-premise开发不同,当代码在Azure中托管运行时,会有一些意想不到的k-v对被添加到ConfigurationManager.AppSettings和ConfigurationManager.ConnectionStrings中。这时候如果代码中有遍历这两个集合的操作,就会发生难以预料的结果。
<appSettings> <add key="webpages:Version" value="3.0.0.0"/> <add key="webpages:Enabled" value="false"/> <add key="ClientValidationEnabled" value="true"/> <add key="UnobtrusiveJavaScriptEnabled" value="true"/> <add key="throwEx" value="1"/> </appSettings> <connectionStrings> <add name="Conn" connectionString="Data Source=13.*.*.*,1433;Initial Catalog=testDB;User ID=testDBUser;Password=******;" providerName="System.Data.SqlClient" /> </connectionStrings>
On-premise时,ConfigurationManager.AppSettings会包含5组k-v对,ConfigurationManager.ConnectionStrings则包含1组。当代码部署到Azure上时,返回的数目是不能确定的,例如WEBSITE_SITE_NAME、REMOTEDEBUGGINGVERSION等等。尤其需要说明的是,不同的代码访问不同的资源,多出来的k-v也是不一样的。。。具体原因不得而已,目的应该是用来传值。
Best Practice:
如果一定要轮询,可以把自己的key先加到一个列表里,只有在列表中的key才进入轮询。如果需要动态在portal或者web.config文件中增减,建议key命名符合统一规则,代码里用正则进行筛选。