使用以下C#代码:
using System;
using Microsoft.Web.Administration;
namespace getftpstate
{
class Program
{
static void Main(string[] args)
{
ServerManager manager = new ServerManager();
foreach (Site site in manager.Sites)
{
Console.WriteLine("name: " + site.Name);
Console.WriteLine("state: " + site.State);
Console.WriteLine("----");
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
我得到以下输出:
C:\projects\testiisftp\getftpstate\getftpstate\bin\Debug>getftpstate.exe
name: Default Web Site
state: Stopped
----
name: Default FTP Site
Unhandled Exception: System.Runtime.InteropServices.COMException (0x800710D8): T
he object identifier does not represent a valid object. (Exception from HRESULT:
0x800710D8)
at Microsoft.Web.Administration.Interop.IAppHostProperty.get_Value()
at Microsoft.Web.Administration.ConfigurationElement.GetPropertyValue(IAppHos
tProperty property)
at Microsoft.Web.Administration.Site.get_State()
at getftpstate.Program.Main(String[] args) in C:\projects\testiisftp\getftpst
ate\getftpstate\Program.cs:line 17
Run Code Online (Sandbox Code Playgroud)
任何想法,为什么我可能会看到上面的0x800710D8 COM错误?我能够使用IIS管理器管理FTP站点(我可以启动,停止,更改设置等).
要澄清的第一件事是Site.State获取HTTP协议状态的属性,因此我的猜测是抛出该异常的站点可能不是HTTP站点.
如果你想获得FTP状态,你需要做的是:
int ftpState = Site.GetChildElement("ftpServer")["state"]
Run Code Online (Sandbox Code Playgroud)
您可以通过检查Site.Bindings并查找Protocol属性来验证站点是否为HTTP,如果它没有HTTP或HTTPS,您将获得上面可以安全忽略的异常.
有关更多信息:IIS.net FTP设置/示例代码
我认为答案是,这只是 Microsoft IIS API 中的一个错误,我们必须忍受。我已经在 MS connect 上打开了一份错误报告,该报告已获得 2 票赞成,但是 MS 对此没有表现出兴趣(我怀疑他们很快就会这样做)。
我不相信有一种解决方法可以获取实际状态(如问题所问)。有些人建议我应该探测端口 21,但这只能告诉我是否有FTP 服务器正在运行,而不是告诉我正在运行什么FTP 服务器(因为您可以拥有多个站点)——所以在某些情况下,这种方法完全没有用。
停止和启动站点(这也会导致类似错误)的解决方法是在 FTP 站点上将自动启动设置为 false,然后重新启动 IIS(这不是很好,但工作得很好)。