2009-01-22 13 views
0

Je suis face à un problème étrange dans IIS 7.0:comportement étrange dans IIS 7.0 - System.DirectoryServices

J'ai le répertoire virtuel suivant dans IIS: alt text http://i39.tinypic.com/4iijbb.jpg

et que le mode d'authentification Windows est activé sur le répertoire virtuel dans IIS

maintenant, si je tente de s'associé DirectoryEntry pour TestV/dossier/file.aspx de cette manière:

string vDir = @"/TestV/folder/file.aspx"; 

      DirectoryEntry dir = new DirectoryEntry("IIS://" + serverName + "/W3SVC/1/ROOT" + vDir, @"adminusername", @"password"); 
      dir.AuthenticationType = AuthenticationTypes.Secure; 

      try 
      { 
       Console.WriteLine(dir.Name); 
      } 
      catch (Exception exp) 
      { 
       Console.WriteLine(exp.Message); 
      } 

      Console.WriteLine(""); 

Je reçois l'exception: « Le système ne peut pas trouver le chemin d'accès spécifié »

Maintenant, si je retourne à IIS puis procédez comme suit: Faites un clic droit sur TestV/Dossier et activer le mode d'authentification anonyme et puis le désactiver à nouveau

Faites un clic droit sur TestV/dossier/file.aspx et activer le mode d'authentification anonyme puis le désactiver à nouveau

Essentiellement je viens o effectué un accès manuel n le fichier aspx Testv/Folder/file.aspx.

Après les étapes ci-dessus si je re exécuter le programme, le code est en mesure d'accéder avec succès l'entrée de répertoire et imprime avec succès le nom (file.aspx)

Quel est le problème ici?

Un plus d'informations:

Je vois ce comportement sur IIS 6.0 également. Donc, il semble que jusqu'à et à moins que je fais une opération manuelle dans IIS pour un dossier/fichier dans le répertoire virtuel, il ne crée pas les métadonnées correspondantes dans le répertoire actif?

Répondre

1

Je suis la réponse au problème (avec l'aide d'un de mes collègues)

Voici la solution: 1. Le programme a besoin d'ajouter des entrées aux métadonnées IIS avant d'accès (pseudo?) le fichier/dossier sous le répertoire virtuel, avant accéder à l'entrée:

try 
      { 
       // make pseudo entries: 
       DirectoryEntry folder = rootDir.Children.Add("Folder", "IISWebDirectory"); 
       folder.CommitChanges(); 
       file = folder.Children.Add("File.aspx", "IISWebFile"); 
       file.CommitChanges(); 
      } 

Ensuite, le tour est joué, il fonctionne

PS:

DirectoryEntry dir = new DirectoryEntry("IIS://" + serverName + "/W3SVC/1/ROOT" + vDir, @"adminusername", @"password"); 
dir.AuthenticationType = AuthenticationTypes.Secure; 
dir.RefreshCache(); 

Directory.Refresh ne permet pas

+0

Vous pouvez utiliser la méthode DirectoryEntry.Exists statique pour voir si l'entrée existe. – robertburke

0

Cela aide-t-il si vous appelez RefreshCache() juste après la troisième ligne?

DirectoryEntry dir = new DirectoryEntry("IIS://" + serverName + "/W3SVC/1/ROOT" + vDir, @"adminusername", @"password"); 
dir.AuthenticationType = AuthenticationTypes.Secure; 
dir.RefreshCache(); 
0

Bien que ce n'est pas exactement une réponse que je voudrais souligner que System.DirectoryServices n'est pas généralement utilisé pour interagir avec IIS. Bien qu'il puisse vous donner accès aux paramètres IIS, WMI est généralement un meilleur choix.