用VS2012但没有VS2010干净的机器上的多个角色实例的Windows Azure计算仿真器(S

2019-07-05 19:46发布

你有没有试过在运行全IIS和多个角色实例在Windows Azure模拟器的托管服务? 几天前,我注意到,只有Web角色的多个实例之一是startet IIS中的时间。 下面的屏幕截图示出的行为和在屏幕截图的前面的消息框示出了用于这种现象的原因。 出现在尝试启动在IIS管理器中停止网站的一个消息框。

截图:IIS与停止网站

样本云应用程序包含两个Web角色:MvcWebRole1和WCFServiceWebRole1每个配置为使用三个实例。 我首先想到的是:“当然没有端口冲突会在现实世界蔚蓝发生,因为每一个角色实例是一个自己的虚拟机,也不会在模拟器上工作!。!” 但Azure计算仿真器的一些研究和分析很多地方后,我发现,在计算模拟器会为每个角色实例一个唯一的IP(从127.255.0.0我的例子高达127.255.0.5)。 这MSDN博客文章(http://blogs.msdn.com/b/avkashchauhan/archive/2011/09/16/whats-new-in-windows-azure-sdk-1-5-each-instance-in-any -role-得到其通自己的IP地址的配搭,计算仿真器关闭的云-environment.aspx微软员工)Avkash肖汉描述这种行为也是如此。 这个结论后,我来到了以下问题: 凭啥不计算模拟器(更准确地说DevFC.exe)不添加到每个网站的绑定信息的适当角色的IP ???

我加入了IP用手和tadaaaaa每个网址:每个网站可以在没有任何冲突的开始。 下面的截图与强调改变的绑定信息表明它。

截图:与IIS网站启动

再次声明:凭啥不模拟器不是为我做吗? 我写了一个小的静态辅助方法做绑定扩展事情对我来说每个角色开始。 也许有人想使用它:

public static class Emulator
{
    public static void RepairBinding(string siteNameFromServiceModel, string endpointName)
    {
        // Use a mutex to mutually exclude the manipulation of the iis configuration.
        // Otherwise server.CommitChanges() will throw an exeption!
        using (var mutex = new System.Threading.Mutex(false, "AzureTools.Emulator.RepairBinding"))
        {
            mutex.WaitOne();

            using (var server = new Microsoft.Web.Administration.ServerManager())
            {
                var siteName = string.Format("{0}_{1}", Microsoft.WindowsAzure.ServiceRuntime.RoleEnvironment.CurrentRoleInstance.Id, siteNameFromServiceModel);
                var site = server.Sites[siteName];

                // Add the IP of the role to the binding information of the website
                foreach (Binding binding in site.Bindings)
                {
                    //"*:82:"
                    if (binding.BindingInformation[0] == '*')
                    {
                        var instanceEndpoint = RoleEnvironment.CurrentRoleInstance.InstanceEndpoints[endpointName];
                        string bindingInformation = instanceEndpoint.IPEndpoint.Address.ToString() + binding.BindingInformation.Substring(1);
                        binding.BindingInformation = bindingInformation;
                        server.CommitChanges();
                    }
                    else
                    {
                        throw new InvalidOperationException();
                    }
                }
            }

            // Start all websites of the role if all bindings of all websites of the role are prepared.
            using (var server = new Microsoft.Web.Administration.ServerManager())
            {
                var sitesOfRole = server.Sites.Where(site => site.Name.Contains(RoleEnvironment.CurrentRoleInstance.Role.Name));
                if (sitesOfRole.All(site => site.Bindings.All(binding => binding.BindingInformation[0] != '*')))
                {
                    foreach (Site site in sitesOfRole)
                    {
                        if (site.State == ObjectState.Stopped)
                        {
                            site.Start();
                        }
                    }
                }
            }

            mutex.ReleaseMutex();
        }
    }
}

我称之为辅助方法如下

public class WebRole : RoleEntryPoint
{
    public override bool OnStart()
    {
        if (RoleEnvironment.IsEmulated)
        {
            AzureTools.Emulator.RepairBinding("Web", "ServiceEndpoint");
        }

        return base.OnStart();
    }
}

Answer 1:

我知道了!

我有在其上的所有格式,并用新鲜干净的Windows 8时,Visual Studio 2012和Azure的SDK 1.8和Azure工具安装最近担任三台不同的机器这种行为。 所以在Azure SDK和工具的重新安装(如安东建议)不应该改变任何东西。 但我的三台机器的清洁是关键点! 安东,你有Visual Studio 2010中你的机器上有至少VS2010 SP 1安装? 我分析IISConfigurator.exe与ILSpy,发现这台IP的网站的绑定信息的代码,以'*' (而不是127.255.0.* )。 这取决于静态属性Microsoft.WindowsAzure.Common.Workarounds.BindToAllIpsWorkaroundEnabled 。 这种方法在内部使用Microsoft.WindowsAzure.Common.Workarounds.TryGetVS2010SPVersion并导致设置IP绑定到'*'如果Visual Studio 2010中的SP水平小于1 TryGetVS2010SPVersion检查四个注册表项,我不知道为什么,但不的关键之一存在于我的注册表UND返回Visual Studio 2010的SP 0级(我从来没有安装在三台机器没有人VS2010 !!!)。 当我改变的值HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\DevDiv\vs\Servicing\10.0\SP从0到10(更伟大的0应该这样做)在Azure模拟器开始设置127.255.0.*的IP地址的角色在所有的IIS和所有网站的网站的绑定信息是否正确启动。



文章来源: Strange behavior of Windows Azure Compute Emulator (SDK 1.8) with multiple role instances on a clean machine with VS2012 but WITHOUT VS2010