У меня есть служба 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?)