我在 WebApi Controller 类上有以下 EnableCors 属性:
[EnableCors(origins:"http://localhost:57280", headers: "*", methods: "*")]
public class PhysicalActivityController : ApiController
但我不希望该网址被硬编码。我想从 web.config 获取它。
类似这样的事情:
[EnableCors(origins: System.Web.Configuration.WebConfigurationManager.AppSettings["ModellingApiUrl"], headers: "*", methods: "*")]
public class PhysicalActivityController2 : ApiController
问题是我无法从属性中访问类似的方法。代码的上下文与普通方法中的上下文不同。当我按照第二个示例编写代码时,Visual Studio 以红色突出显示“AppSettings”,并给出错误“无法解析符号“AppSettings””。
关于如何实现这一目标有什么想法吗?我尝试编写一个继承自 EnableCors 的自定义属性,但遗憾的是 System.Web.Http.Cors.EnableCorsAttribute 是一个密封类,因此我无法继承它。
最佳答案
我最终通过批量复制 EnableCors 属性的代码解决了这个问题,然后修改它以从配置中获取值。
问题是传递给属性的字符串是其构造函数的参数,并且需要是编译时常量。因此,我不相信我想做的事情是可能的 - 您必须编辑属性后面的代码。
我的解决方案:
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, AllowMultiple = false)]
[SuppressMessage("Microsoft.Design", "CA1019:DefineAccessorsForAttributeArguments", Justification = "Attribute arguments are accessible as collections.")]
public sealed class EnableCorsUsingConfigAttribute : Attribute, ICorsPolicyProvider
{
public EnableCorsUsingConfigAttribute(string configKeyForOrigins, string headers, string methods)
: this(configKeyForOrigins, headers, methods, null)
{
}
public EnableCorsUsingConfigAttribute(string configKeyForOrigins, string headers, string methods, string exposedHeaders)
{
string origins = System.Web.Configuration.WebConfigurationManager.AppSettings[configKeyForOrigins];
(其余代码是EnableCors属性的直接副本)
用法:
[EnableCorsUsingConfig(configKeyForOrigins: "ModellingApiClientUrls", headers: "*", methods: "*")]
public class PhysicalActivityController : ApiController
{
关于.net - 如何从类属性中访问 web.config 值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27127449/