gpt4 book ai didi

azure - 在装有 VS2012 但没有 VS2010 的干净计算机上,具有多个角色实例的 Windows Azure 计算模拟器 (SDK 1.8) 的奇怪行为

转载 作者:行者123 更新时间:2023-12-02 15:01:50 25 4
gpt4 key购买 nike

您是否曾经尝试过在具有完整 IIS 和多个角色实例的 Windows Azure 模拟器中运行托管服务?几天前,我注意到 IIS 中一次只有一个 Web 角色的多个实例启动。以下屏幕截图说明了该行为,屏幕截图前面的消息框显示了此行为的原因。尝试启动 IIS 管理器中已停止的网站之一时会出现消息框。

Screenshot: IIS with stopped Websites

示例云应用程序包含两个 Web 角色:MvcWebRole1 和 WCFServiceWebRole1,每个角色都配置为使用三个实例。我的第一个想法是:“当然!在真实的 azure 世界中不会发生端口冲突,因为每个角色实例都是一个自己的虚拟机。它无法在模拟器中运行!”但经过一些研究和分析 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微软员工 Avkash Chauhan 的 -role-gets-its-own-ip-address-to-match-compute-emulator-close-the-cloud-environment.aspx)也描述了这种行为。得出这个结论后,我得出了以下问题:为什么计算模拟器(更准确地说是 DevFC.exe)不将适当角色的 IP 添加到每个网站的绑定(bind)信息中???

我手动将 IP 添加到每个网站,tadaaaaa:每个网站都可以启动而不会发生任何冲突。下一个屏幕截图演示了它,并突出显示了更改后的绑定(bind)信息。

Screenshot: IIS with started Websites

再一次:为什么模拟器不帮我做呢?我编写了一个小的静态辅助方法,在每个角色启动时为我执行绑定(bind)扩展操作。也许有人想使用它:

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();
}
}

最佳答案

我明白了!

我在三台不同的计算机上遇到了这种情况,这些计算机最近都已格式化并安装了全新的 Windows 8、Visual Studio 2012 和 Azure SDK 1.8 以及 Azure Tools。因此,重新安装 Azure SDK 和工具(如 Anton 的建议)不应改变任何内容。但我的三台机器的清洁度才是关键! Anton,您的计算机上是否有 Visual Studio 2010,并且至少安装了 VS2010 SP 1?我用ILSpy分析了IISConfigurator.exe,发现将网站绑定(bind)信息中的IP设置为'*'(而不是127.255.0.0.1)的代码。 *)。它取决于静态属性 Microsoft.WindowsAzure.Common.Workarounds.BindToAllIpsWorkaroundEnabled。此方法内部使用 Microsoft.WindowsAzure.Common.Workarounds.TryGetVS2010SPVersion,如果 Visual Studio 2010 的 SP 级别小于 1,则会导致将 IP 绑定(bind)设置为 '*' . TryGetVS2010SPVersion 检查了四个注册表项,我不知道为什么,但其中一个项存在于我的注册表中并返回 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.* IIS中所有网站的绑定(bind)信息的角色IP以及所有网站均启动正确。

关于azure - 在装有 VS2012 但没有 VS2010 的干净计算机上,具有多个角色实例的 Windows Azure 计算模拟器 (SDK 1.8) 的奇怪行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13946634/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com