【问题标题】:Removing IP from IIS Site Binding从 IIS 站点绑定中删除 IP
【发布时间】:2014-12-31 14:15:15
【问题描述】:

伙计们,我正在尝试通过 C#(Microsoft Web 管理)从 IIS 站点绑定中删除特定 IP。

基本上我想要做的是检查 IIS 中所有站点的绑定,如果任何绑定 IP 与用户提供的 IP 匹配,它应该删除它,如果特定站点没有任何其他具有不同 IP 的绑定然后它应该停止网站。

但是,我似乎无法在循环中删除 IP,因为我收到 “集合已修改;枚举操作可能无法执行。” 错误。

这是我的代码:

static void Main(string[] args)
{
    ServerManager mgr = new ServerManager();

    foreach (Site s in mgr.Sites)
    {
        Console.WriteLine("Site {0}", s.Name);

        foreach (Application app in s.Applications)
        {
            Console.WriteLine("\tApplication: {0}", app.Path);

            foreach (VirtualDirectory virtDir in app.VirtualDirectories)
            {
                Console.WriteLine("\t\tVirtual Dir: {0}", virtDir.Path);
            }
        }

        BindingCollection bindingCollection = s.Bindings;
        foreach (Binding b in  bindingCollection)
        {
            Console.WriteLine("\n Bindings: {0}",b.EndPoint);
            if (b.EndPoint != null)
            {
                //Hard Coded IP for testing purpose
                if (b.EndPoint.ToString() == "1.1.1.1:86")
                {
                    Console.WriteLine("Removing this ip : {0}",b.EndPoint.ToString());
                    bindingCollection.Remove(b);
                }
            }
        }
      mgr.CommitChanges();
    }
    Console.ReadLine();
}

我应该怎么做才能删除绑定?我需要循环删除它,因为一个站点可能有多个使用相同 IP 的绑定。

【问题讨论】:

  • 先创建一个集合的副本。
  • 怎么样?我似乎无法创建 BindingCollection 的对象,也无法将 null 分配给 BindingCollection 然后将绑定添加到它,因为我得到“对象未设置为对象的实例”错误

标签: c# iis


【解决方案1】:

枚举器针对作为 BCL 一部分的大多数集合进行了版本控制,这意味着您在循环访问集合时无法修改它。您可以像这样复制集合:

var bindingCollection = new List<Binding>(s.Bindings);

所以现在你的循环看起来像这样:

var bindings = s.Bindings;
var bindingCollection = new List<Binding>(bindings);
foreach (Binding b in bindingCollection)
{
    Console.WriteLine("\n Bindings: {0}", b.EndPoint);
    if (b.EndPoint != null)
    {
        //Hard Coded IP for testing purpose
        if (b.EndPoint.ToString() == "1.1.1.1:86")
        {
            Console.WriteLine("Removing this ip : {0}", b.EndPoint.ToString());
            bindings.Remove(b);
        }
    }
}

但是,这实际上并没有像您期望的那样删除绑定。您需要调用b.Delete() 才能真正删除绑定。当您使用Remove 时,您所做的就是将其从现有绑定构建的集合中删除。因此,在将其从集合中删除之前添加 b.Delete()

【讨论】:

  • 感谢您的回答。我尝试了您上面的建议,迭代问题消失了,但是绑定仍然存在并且似乎没有被删除。我也尝试了b.Delete(),但我仍然可以看到 IIS 中的绑定。这是为什么呢?
  • @NewbieProgrammer 我相信您需要在删除所有绑定后致电mgr.CommitChanges();
猜你喜欢
  • 2020-01-06
  • 1970-01-01
  • 1970-01-01
  • 2020-06-02
  • 1970-01-01
  • 2012-04-24
  • 2010-09-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多