【问题标题】:Restart the site only works when I put a breakpoint above仅当我在上面放置断点时,重新启动站点才有效
【发布时间】:2012-08-21 22:53:53
【问题描述】:

上下文

我使用ServerManager 类在网站上执行一些操作。

实际上,我删除了 site1 上的绑定 (http/https),​​然后在 site2 上重新创建它。

我使用.CommitChanges() 保存更改。

之后,问题是 IIS 关闭了该站点。所以我使用site2.Start() 来重启网站。

但这不起作用...除非我在site2.Start()上设置断点。

知道发生了什么吗?你有解决办法吗?

完整代码(在最后一行重新开始)

var serverManager = new ServerManager();
var regex = new Regex("^(http|https)://");
var host = regex.Replace(url, "");
var instance = serverManager.Sites.First(site => site.Bindings.Any(binding => binding.Host == host));
var pool = instance.Applications[0].ApplicationPoolName;
var bindingHttp = instance.Bindings.First(attr => attr.Host == host && attr.Protocol == "http");
var bindingHttps = !host.Contains("xxx") ? instance.Bindings.First(attr => attr.Host == host && attr.Protocol == "https") : null;
var bindingHttpInformation = bindingHttp.BindingInformation;
var bindingHttpsInformation = !host.Contains("xxx") ? bindingHttps.BindingInformation : null;
var certificateHash = !host.Contains("xxx") ? bindingHttps.CertificateHash : null;
var certificateStoreName = !host.Contains("xxx") ? bindingHttps.CertificateStoreName : null;
var newSiteName = getPoolOrSiteName(pool);
var newSite = serverManager.Sites.First(attr => attr.Name == newSiteName);
var bindingCollection = newSite.Bindings;

instance.Bindings.Remove(bindingHttp);

if (!host.Contains("xxx"))
{
    instance.Bindings.Remove(bindingHttps);

    var binding = newSite.Bindings.CreateElement("binding");
    binding["protocol"] = "https";
    binding["certificateHash"] = certificateHash;
    binding["certificateStoreName"] = certificateStoreName;
    binding["bindingInformation"] = bindingHttpsInformation;
    bindingCollection.Add(binding);
}

var binding2 = newSite.Bindings.CreateElement("binding");
binding2["protocol"] = "http";
binding2["bindingInformation"] = bindingHttpInformation;
bindingCollection.Add(binding2);

serverManager.CommitChanges();

newSite.Start(); //only works if I put a breakpoint here

【问题讨论】:

    标签: c# visual-studio-2010 iis-7 servermanager


    【解决方案1】:

    我认为这是一个时间问题。当您使用 IIS 管理控制台停止站点并随后尝试启动它时,情况也是如此。你必须给它一些时间来完成停止。所以(警告:丑陋的)睡眠可能会:

    System.Threading.Thread.Sleep(5000);
    

    它在调试时工作的事实是因为你在继续之前给了它延迟。

    【讨论】:

    • 它有效,谢谢!没有办法检索“whenStopped”事件来重新启动站点?
    • 你会这么认为,但我对此的了解相当有限。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-06-16
    • 2010-09-29
    • 2020-02-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多