views:

115

answers:

3

Hello all,

This is my code for creating Virtual Directory in IIS:

/// <summary> 
/// Creates the virtual directory. 
/// </summary> 
/// <param name="webSite">The web site.</param> 
/// <param name="appName">Name of the app.</param> 
/// <param name="path">The path.</param> 
/// <returns></returns> 
/// <exception cref="Exception"><c>Exception</c>.</exception> 
public static bool CreateVirtualDirectory(string webSite, string appName, string path) 
{ 
    var schema = new DirectoryEntry("IIS://" + webSite + "/Schema/AppIsolated"); 
    bool canCreate = !(schema.Properties["Syntax"].Value.ToString().ToUpper() == "BOOLEAN"); 
    schema.Dispose(); 

    if (canCreate) 
    { 
        bool pathCreated = false; 
        try 
        { 
            var admin = new DirectoryEntry("IIS://" + webSite + "/W3SVC/1/Root"); 

            //make sure folder exists 
            if (!Directory.Exists(path)) 
            { 
                Directory.CreateDirectory(path); 
                pathCreated = true; 
            } 

            //If the virtual directory already exists then delete it 
            IEnumerable<DirectoryEntry> matchingEntries = admin.Children.Cast<DirectoryEntry>().Where(v => v.Name == appName); 
            foreach (DirectoryEntry vd in matchingEntries) 
            { 
                admin.Invoke("Delete", new[] { vd.SchemaClassName, appName });  
                admin.CommitChanges(); 
                break; 
            } 

            //Create and setup new virtual directory 
            DirectoryEntry vdir = admin.Children.Add(appName, "IIsWebVirtualDir"); 

            vdir.Properties["Path"][0] = path; 
            vdir.Properties["AppFriendlyName"][0] = appName; 
            vdir.Properties["EnableDirBrowsing"][0] = false; 
            vdir.Properties["AccessRead"][0] = true; 
            vdir.Properties["AccessExecute"][0] = true; 
            vdir.Properties["AccessWrite"][0] = false; 
            vdir.Properties["AccessScript"][0] = true; 
            vdir.Properties["AuthNTLM"][0] = true; 
            vdir.Properties["EnableDefaultDoc"][0] = true; 
            vdir.Properties["DefaultDoc"][0] = 
                "default.aspx,default.asp,default.htm"; 
            vdir.Properties["AspEnableParentPaths"][0] = true; 
            vdir.CommitChanges(); 

            //the following are acceptable params 
            //INPROC = 0, OUTPROC = 1, POOLED = 2 
            vdir.Invoke("AppCreate", 1); 

            return true; 
        } 
        catch (Exception) 
        { 
            if (pathCreated) 
                Directory.Delete(path); 
            throw; 
        } 
    } 
    return false; 
} 

This code was taken from some other user who suggested it, and it works fine for him and other users.

The error I get when I trigger the function:

The RPC server is unavailable.

Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code.

Exception Details: System.Runtime.InteropServices.COMException: The RPC server is unavailable.

I'm using Windows Server 2008 R2,

IIS 7.5

ASP.NET 4.0

Thanks in advance!

A: 

Have you checked to make sure the IISAdmin service is running?

Try running:

net start iisadmin
Matthew Abbott
Hello Matthew and thanks for the reply.The service is already running.
Gal V
A: 

Firewall? Check that you can access, from same server, outside of the application, to confirm.

A: 

What user are you running this code as? You need to be an admin to be able to write to the metabase so if, for example, you are running this from within IIS using the anonymous user you will not be able to write to the metabase.

Mike