2014-11-25 4 views
2

У меня есть атрибут следующие EnableCors на классе контроллера WebAPI:Как получить доступ к значениям web.config из атрибута класса?

[EnableCors(origins:"http://localhost:57280", headers: "*", methods: "*")] 
public class PhysicalActivityController : ApiController 

Но я не хочу, чтобы URL жестко закодирован. Я хочу получить его из 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 является закрытым классом, поэтому я не могу наследовать его.

ответ

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

использовать этот код я надеюсь, что это полезно для вас

+1

К сожалению, нет, это не работает, либо , Проблема в том, что вы находитесь в середине атрибута, когда вы пишете этот код - вы не в обычном контексте кода. Поэтому кажется, что вы не можете вызывать методы на системных объектах так, как обычно. Если вы попытаетесь это сделать, вы поймете, что я имею в виду. – ClareSudbery

+0

Чтобы уточнить: когда я пишу код, как во втором примере выше, Visual Studio выделяет «AppSettings» красным цветом и дает ошибку «Не удается разрешить символ« AppSettings ». – ClareSudbery

1

Я решил это в конце концов на оптовую копию коды для 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 
{ 
+0

Похоже, что это решит мою проблему, но где я могу найти остальную часть кода CORS для нового класса? –

+0

Используйте Visual Studio для просмотра кода для существующего атрибута EnableCors. Моим методом было бы временно добавить атрибут на что-то, поместить в него курсор, затем нажать F12 или Ctrl + B (в зависимости от сопоставления клавиатуры) или щелкнуть правой кнопкой мыши - «Перейти к реализации». – ClareSudbery

Смежные вопросы