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.
精彩评论