Вызов метода инициализации объекта AzMan вызывает исключение FileNotFoundException - PullRequest
1 голос
/ 20 января 2011

У меня есть служба WCF, у которой есть класс, который наследует System.Web.Security.RoleProvider.В этом классе я использую диспетчер авторизации (AzMan) - используя AzRoles.dll - для управления ролями.

Аутентификация в экземпляре ADAM.

У меня были проблемы с моей службой под нагрузкой иказалось, что мне нужно изменить службу так, чтобы хранилище AzMan открывалось и закрывалось для каждого вызова - в противном случае объекты не освобождались, и в конечном итоге пул приложений падал - по крайней мере, это то, что, кажется, происходит - я былневозможно подтвердить это 100%.

В исходном коде хранилище AzMan было инициализировано в переопределенном методе Initialize следующим образом:

public class AzManProvider : RoleProvider {
.
.
.
    public override void Initialize( string name, System.Collections.Specialized.NameValueCollection config ) {
                base.Initialize( name, config );
                if ( config != null ) {
                    string appName = null;
                    string connStr = null;
                    foreach ( string k in config.Keys ) {
                        string key = k.ToLower().Trim();
                        string value = config[k];
                        if ( key == "applicationName".ToLower() ) {
                            appName = value;
                        } else if ( key == "connectionStringName".ToLower() ) {
                            connStr = ConfigurationManager.ConnectionStrings[value].ConnectionString;
                        }
                    }
                    if ( connStr.IsEmpty() )
                        throw new ArgumentNullException( "connectionStringName" );
                    CurrentApplicationName = appName;
                    m_azManStore = new AzAuthorizationStoreClass();
                    try {
                        m_azManStore.Initialize( 0, connStr, null );
                    } catch ( Exception ex ) {
                        throw ex;
                    }
                }
            }
.
.
.
}

Я не уверен, когда этот метод вызывается точно.Если вы запустите его в VS и поставите точку останова, он никогда не попадет.Этот класс создается путем установки ссылки на него в разделе web.config в разделе.

После долгих исследований я наткнулся на это сообщение в блоге , в котором предлагается способ обернутьМагазин AzMan в одноразовом классе - достаточно просто.Я создал класс, который реализует IDisposable:

public class AzManHelper : IDisposable
    {
        public IAzAuthorizationStore Store { get; private set; }
        public IAzApplication Application { get; private set; }

        public AzManHelper(string appName)
        {
            string connStr = ConfigurationManager.ConnectionStrings["AzMan"].ConnectionString;

            try
            {
                    this.Store = new AzAuthorizationStoreClass();
                    this.Store.Initialize(0, connStr, null);   //<-- Exception occurs here
                    this.Store.UpdateCache(null);
                    if (!String.IsNullOrEmpty(appName))
                        this.Application = this.Store.OpenApplication(appName, null);
            }
            catch (COMException cex)
            {
                HandleCOMException(cex);
            }
        }

        public void Dispose()
        {
            if (this.Application == null) 
                return;

            Marshal.FinalReleaseComObject(this.Application);

            if(this.Store != null)
                Marshal.FinalReleaseComObject(this.Store);

            this.Application = null;
            this.Store = null;
        }
}

Теперь, когда я запускаю этот код, я получаю FileNotFoundException при вызове метода Initialize в хранилище AzMan.Я подтвердил, что строка подключения верна.

Что особенно расстраивает, так это то, что этот код будет работать, если я буду запускать его локально в VS 2010, но если я разверну его и запусту как службу WCF, я получу ошибкуЯ упомянул, хотя userID и строка подключения LDAP совпадают.

Я прочитал это сообщение в блоге и опубликовал статью

Затем я подумал, что, возможно, выполняется метод инициализациикак и для любого пула приложений IIS, а код вне этого запускается от имени пользователя-импровизатора.Итак, используя специальный класс, который написал коллега, я отключил олицетворение при вызове метода инициализации AzMan.Я подтвердил, что пользователь был NETWORK SERVICE, но я все еще получаю то же FileNotFoundException.Я работал с ИТ-специалистами, чтобы попробовать разные настройки разрешений, но пока что не повезло.

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

Возможно, мой подход к использованию AzMan неправильный - моя архитектура несовершенна (помимо того, что я использую AzMan?)

1 Ответ

1 голос
/ 25 января 2011

Я разобрался в своей проблеме.Мой сервис WCF размещен в IIS.В файле web.config есть тег.Олицетворение было для учетной записи службы, от которой должна была работать служба.Когда служба WCF размещается в IIS, ASP.NET используется для запуска службы, но это все.Итак, когда приложение запускалось, класс AzManProvider был инициализирован ASP, поэтому имитация выполнялась.Метод Initialize вызывается во время создания экземпляра класса.У учетной записи servcice есть права на открытие AzMan.При вызовах службы WCF не используются какие-либо параметры конфигурации ASP в файле web.config.Итак, сервисные вызовы выполняются под идентификатором пула приложений - NETWORK SERVICE.Чтобы это исправить, мы изменили идентификатор пула приложений, чтобы он выполнялся как учетная запись службы, и удалили тег из web.config.Теперь все работает.

Я не понимаю, почему отсутствие разрешений безопасности приведет к исключению FileNotFound.

...