开发者

Creating ftp site programmatically

i have written code to create new site in ftp. but its giving com exception. the code is attached for reference.

Exception details are

System.Runtime.InteropServices.COMException was unhandled
  Message="Filename: \r\nError: Unrecognized element 'ftpServer'\r\n\r\n"
  Source=""
  ErrorCode=-2147023483
  StackTrace:
       at Microsoft.Web.Administration.Interop.IAppHostElement.GetElementByName(String bstrSubName)
       at Microsoft.Web.Administration.ConfigurationElement.GetChildElement(String elementName)
       at WindowsFormsTest.Form2.CreateFTPSite(String serverName, String siteName, String siteID) in D:\My Projects\WindowsFormsTest\WindowsFormsTest\Form2.cs:line 48
       at WindowsFormsTest.Form2.button1_Click(Object sender, EventArgs e) in D:\My Projects\WindowsFormsTest\WindowsFormsTest\Form2.cs:line 25
       at System.Windows.Forms.Control.OnClick(EventArgs e)
       at System.Windows.Forms.Button.OnClick(EventArgs e)
       at System.Windows.Forms.Button.OnMouseUp(MouseEventArgs mevent)
       at System.Windows.Forms.Control.WmMouseUp(Message& m, MouseButtons button, Int32 clicks)
       at System.Windows.Forms.Control.WndProc(Message& m)
       at System.Windows.Forms.ButtonBase.WndProc(Message& m)
       at System.Windows.Forms.Button.WndProc(Message& m)
       at System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m)
       at System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m)
       at System.Windows.Forms.NativeWindow.DebuggableCallback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)
       at System.Windows.Forms.UnsafeNativeMethods.DispatchMessageW(MSG& msg)
       at System.Windows.Forms.Application.ComponentManager.System.Windows.Forms.UnsafeNativeMethods.IMsoComponentManager.FPushMessageLoop(Int32 dwComponentID, Int32 reason, Int32 pvLoopData)
       at System.Windows.Forms.Application.ThreadContext.RunMessageLoopInner(Int32 reason, ApplicationContext context)
       at System.Windows.Forms.Application.ThreadContext.RunMessageLoop(Int32 reason, ApplicationContext context)
       at System.Windows.Forms.Application.Run(Form mainForm)
       at WindowsFormsTest.Program.Main() in D:\My Projects\WindowsFormsTest\WindowsFormsTest\Program.cs:line 18
       at System.AppDomain._nExecuteAssembly(Assembly assembly, String[] args)
       at System.AppDomain.ExecuteAssembly(String assemblyFile, Evidence assemblySecurity, String[] args)
       at Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly()
       at System.Threading.ThreadHelper.ThreadStart_Context(Object state)
       at System.Threading.Exec开发者_高级运维utionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
       at System.Threading.ThreadHelper.ThreadStart()
  InnerException: 

code to create ftp site:

using(ServerManager serverManager = new ServerManager()) { 
        Microsoft.Web.Administration.Configuration config = serverManager.GetApplicationHostConfiguration();

        ConfigurationSection sitesSection = config.GetSection("system.applicationHost/sites");

        ConfigurationElementCollection sitesCollection = sitesSection.GetCollection();

        ConfigurationElement siteElement = sitesCollection.CreateElement("site");
        siteElement["name"] = @"eMentorftp";

        ConfigurationElementCollection bindingsCollection = siteElement.GetCollection("bindings");

        ConfigurationElement bindingElement = bindingsCollection.CreateElement("binding");
        bindingElement["protocol"] = @"ftp";
        bindingElement["bindingInformation"] = @"*:21:";
        bindingsCollection.Add(bindingElement);

        ConfigurationElement ftpServerElement = siteElement.GetChildElement("ftpServer");

        ConfigurationElement securityElement = ftpServerElement.GetChildElement("security");

        ConfigurationElement sslElement = securityElement.GetChildElement("ssl");
        sslElement["serverCertHash"] = @"53FC3C74A1978C734751AB7A14A3E48F70A58A84";
        sslElement["controlChannelPolicy"] = @"SslRequire";
        sslElement["dataChannelPolicy"] = @"SslRequire";

        ConfigurationElement authenticationElement = securityElement.GetChildElement("authentication");

        ConfigurationElement basicAuthenticationElement = authenticationElement.GetChildElement("basicAuthentication");
        basicAuthenticationElement["enabled"] = true;

        ConfigurationElementCollection siteCollection = siteElement.GetCollection();

        ConfigurationElement applicationElement = siteCollection.CreateElement("application");
        applicationElement["path"] = @"/";

        ConfigurationElementCollection applicationCollection = applicationElement.GetCollection();

        ConfigurationElement virtualDirectoryElement = applicationCollection.CreateElement("virtualDirectory");
        virtualDirectoryElement["path"] = @"/";
        virtualDirectoryElement["physicalPath"] = @"D:\Ftp";
        applicationCollection.Add(virtualDirectoryElement);
        siteCollection.Add(applicationElement);
        sitesCollection.Add(siteElement);

        serverManager.CommitChanges();


You can tell what your error is from the exception. Look at the first line in the exception stack trace:

System.Runtime.InteropServices.COMException was unhandled Message="Filename: \r\nError: Unrecognized element 'ftpServer'\r\n\r\n" Source="" ErrorCode=-2147023483

First of all, we see "Unrecognized element 'ftpserver'" - which should tell us a lot about what happened when we look at your code. But in addition to that, we are provided an error code that tells us exactly why the COMException got thrown. If we decode the error code into an unsigned int (hex), we get:

0x80070585

This corresponds to an error code of:

  • 8: Failure
  • 7: Win32
  • 585: (1413 decimal): Invalid Index (ERROR_INVALID_INDEX)

For more info on error codes, see HRESULT and Win32 error codes.

So, we threw a COMException becuase we used an invalid index. And we get an "unrecognized element 'ftpServer'" in the exception message. Looking at your code, you create a new ConfigurationElement siteElement by telling the sitesCollection to add a new element named "site":

Microsoft.Web.Administration.Configuration config = serverManager.GetApplicationHostConfiguration();
ConfigurationSection sitesSection = config.GetSection("system.applicationHost/sites");
ConfigurationElementCollection sitesCollection = sitesSection.GetCollection();
ConfigurationElement siteElement = sitesCollection.CreateElement("site");

You then create a name for the site, and create bindings in the site's bindings collection:

siteElement["name"] = @"eMentorftp";
ConfigurationElementCollection bindingsCollection = siteElement.GetCollection("bindings");
ConfigurationElement bindingElement = bindingsCollection.CreateElement("binding");
bindingElement["protocol"] = @"ftp";
bindingElement["bindingInformation"] = @"*:21:";
bindingsCollection.Add(bindingElement);

Unfortunately, you then try to get a child element of the site using the name "ftpServer":

ConfigurationElement ftpServerElement = siteElement.GetChildElement("ftpServer"); 

But, the ConfigurationElement siteElement - which was just made - doesn't have a child named ftpServer! So we get an invalid index and throw an exception. Did you mean to create a child element in this line of code?

As an aside, I imagine that it's a COMException due to interop of the .NET interface to the underlying IIS7 COM objects. Not being an expert (at all) on the Microsoft.Web namespace, that's just a guess.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜