C # - Пользовательский атрибут не найден из GetCustomAttribute из интерфейса - PullRequest
8 голосов
/ 13 апреля 2011

Я пытаюсь настроить пользовательский атрибут, подобный следующему:

[AttributeUsageAttribute(AttributeTargets.Method)]
public sealed class AuthorizationAttribute : Attribute
{
    public AuthorizationAttribute(bool required)
    {
        Required = required;
    }

    public bool Required;
}

В моем интерфейсе контракта на обслуживание у меня есть такой метод:

[OperationContract]
[Authorization(true)]
[WebGet(ResponseFormat = WebMessageFormat.Json, UriTemplate = "randommethod")]
ReturnObject RandomMethod();

Когда я делаю следующее, я вижу это в списке, но сравнение «есть» завершается неудачей:

foreach(object attribute in methodInfo.GetCustomAttributes(true)) // Returns all 3 of my attributes.

if (attribute is AuthorizationAttribute) //Does not pass

Я пытался сделать следующее, что возвращает false:

Attribute.IsDefined(methodInfo, typeof(AuthorizationAttribute));
attribute.GetType().IsAssignableFrom(typeof(AuthorizationAttribute));

Я также сделал следующие 2 вещи, которые возвращают нуль:

AuthorizationAttribute authAttribute = attribute as AuthorizationAttribute;
Attribute attribute = Attribute.GetCustomAttribute(methodInfo, typeof(AuthorizationAttribute));

Я не уверен, что я здесь делаю неправильно. Кажется, это должно сработать, но я уверен, что где-то совершаю простую ошибку. Любое понимание?

Спасибо за любую помощь.

Edit: Я не уверен, добавляет ли это какое-либо значение, но объявление AuthorizationAttribute существует в проекте, отличном от моего проекта служб. Интерфейс контракта на обслуживание существует в том же проекте, что и атрибут AuthorizationAttribute.

Я попытался выполнить приведение и получил следующее исключение:

[A]Lib.OAuth.AuthorizationAttribute cannot be cast to [B]Lib.OAuth.AuthorizationAttribute. 
Type A originates from 'Lib, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null' in the
context 'LoadNeither' at location 'F:\RestServices\bin\Lib.dll'. Type B originates from 'Lib,
Version=1.0.0.0, Culture=neutral, PublicKeyToken=null' in the context 'Default' at location 
'C:\Windows\Microsoft.NET\Framework64\v4.0.30319\Temporary ASP.NET Files\oauth_rest\951069b9
\9f7b77fe\assembly\dl3\54c48906\f928a6ad_01facb01\Lib.dll'.

Есть идеи?

Ответы [ 2 ]

5 голосов
/ 13 апреля 2011

Исключение содержит ответ:

Тип A создается ... в расположении 'F: \ RestServices \ bin \ Lib.dll'.Тип B создается ... в папке 'C: \ Windows \ Microsoft.NET \ Framework64 \ v4.0.30319 \ Временные файлы ASP.NET \ oauth_rest \ 951069b9 \ 9f7b77fe \ Assembly \ dl3 \ 54c48906 \ f928a6ad_01facb01 \ Lib.dll'

Проблема в том, что тип Lib.OAuth.AuthorizationAttribute, который определяет ваш метод, находится в сборке, которая отличается от сборки, загруженной во время выполнения при попытке приведения.

Возможно ли, что один из ваших проектов использует старую версию Lib.dll?

1 голос
/ 13 апреля 2011

Благодаря ответу Уэсли я смог понять это. Это скорее «дух», чем все остальное.

Я использовал пример кода для отражения, чтобы загрузить сборку с помощью метода Assembly.LoadFile (...). Проблема в том, что, поскольку моя сборка не была зарегистрирована в GAC, она считывала локальную копию на сервере IIS и сравнение не удалось.

Для справки, это было мое решение:

Assembly.GetExecutingAssembly();

Как только я это сделал, все заработало.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...