你有没有试过在运行全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();
}
}