我正在构建我的应用程序,而且我已经在我的类文件顶部硬编码了很多设置 - 例如ApiSid
和{{ 1}},ApiKey
,SmtpServiceUsername
等我现在正在尝试整合这些内容,我看到了两个选项:
1)将它们全部推入MyEmailPassword
。我不喜欢用几十(几乎100)设置混淆我的web.config的想法......我也觉得这里的安全感不舒服。
2)构建一个只包含这些设置的静态类(Settings.cs) - 基本上包含一堆在整个应用程序中引用的常量。
我对第二种方法感觉更舒服,因为我可以完全隔离我的设置而不用担心通过web.config暴露它们 - 这种方法有什么本质上的错误吗?
答案 0 :(得分:1)
这不一定是最好的方法,但我会将这些设置存储在数据库中。这为您提供了设置的数据库安全性,而且无需停止/重新启动应用程序即可轻松更新设置,从而避免踢出用户。
在数据库中进行设置后,您可以定期加载它们(例如每15-20分钟)以检测更改。在此期间,创建数据字典并将其包装在通过属性提供类型安全访问的类中,或者直接使用字典。由于这是Web应用程序,因此您必须使用线程安全类(如ConcurrentDictionary
)来确保多个线程可以安全地访问您的设置。
如果您有这么多设置,web.config将会混乱,每次更改都会强制重新启动应用池。正如@David在他的回答中提到的,配置文件为您提供了一种简单的方法来为不同的环境设置不同的设置,但这也很容易使用数据库方法,其中每个环境可能存在一次设置。
答案 1 :(得分:1)
这种方法有什么本质上的错误吗?
是什么让你觉得在代码中放置常量比在配置中更安全?编译后的DLL就在Web.Config
旁边,如果有人可以检查其中一个,他们可以检查另一个。硬编码值可以很容易地解编译。
出于某种原因存在配置文件。具体来说,如果任何值将改变每个环境,那么它属于配置文件。这样,可以在任何环境(开发,测试,生产等)中使用相同的相同代码库,并且您只需编辑该环境的配置值。必须重新编译代码只是为了将相同的版本部署到新环境中,这不太理想,因为它不再是相同的版本。
我不喜欢用几十(几乎100)个设置混淆我的web.config的想法
为什么不呢?如果它们是所有平坦的静态值,则appSettings
键列表就可以了。如果有更多结构,请创建custom config sections。