伙计们我试图通过C#(Microsoft Web管理)从IIS站点绑定中删除特定的IP。
基本上我想做的是检查IIS中所有站点的绑定,如果任何绑定IP与用户提供的IP匹配,它应该删除它,如果特定站点没有任何其他绑定不同的IP那么它应该停止该网站。
但是,我似乎无法在循环中删除IP,因为我收到 “集合已被修改;枚举操作可能无法执行。” 错误。< / p>
这是我的代码:
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。
答案 0 :(得分: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()
从集合中删除之前,请先添加{{1}}。