Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/csharp-4.0/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.net 如何从类属性中访问web.config值?_.net_C# 4.0_Cors_Asp.net Web Api_Custom Attributes - Fatal编程技术网

.net 如何从类属性中访问web.config值?

.net 如何从类属性中访问web.config值?,.net,c#-4.0,cors,asp.net-web-api,custom-attributes,.net,C# 4.0,Cors,Asp.net Web Api,Custom Attributes,我在WebApi控制器类上具有以下EnableCors属性: [EnableCors(origins:"http://localhost:57280", headers: "*", methods: "*")] public class PhysicalActivityController : ApiController 但我不想那个网址硬编码。我想从web.config获取它 大概是这样的: [EnableCors(origins: System.Web.Configuration.WebC

我在WebApi控制器类上具有以下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
问题是我无法从属性中访问类似的方法。代码的上下文与普通方法中的上下文不同。当我像第二个示例那样编写代码时,VisualStudio以红色突出显示“AppSettings”,并给出错误“无法解析符号'AppSettings'”

有什么办法可以做到这一点吗?我尝试编写一个从EnableCors继承的自定义属性,但遗憾的是System.Web.Http.Cors.EnableCorsAttribute是一个密封的类,所以我无法从它继承

System.Configuration.ConfigurationManager.ConnectionStrings["ModellingApiUrl"].ToString();

使用此代码我希望这对您有用

我最终解决了这个问题,为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
{

遗憾的是,那也不行。问题是当你编写这个代码时,你处于属性的中间——你不在一个普通的代码上下文中。因此,您似乎无法以正常方式对系统对象调用方法。如果您尝试这样做,您将明白我的意思。为了澄清:当我像上面的第二个示例那样编写代码时,Visual Studio以红色突出显示“AppSettings”,并给出错误“无法解析符号'AppSettings'”。这听起来好像可以解决我的问题,但是我在哪里可以找到新类的其余CORS代码呢?使用Visual Studio查看现有EnableCors属性的代码。我的方法是临时将属性添加到某个对象上,将光标放入其中,然后按F12或Ctrl+B(取决于键盘映射),或右键单击“转到实现”。