Visual studio 2010 如何从VisualStudio2010加速Azure部署
我有一个Visual studio 2010 如何从VisualStudio2010加速Azure部署,visual-studio-2010,deployment,azure,Visual Studio 2010,Deployment,Azure,我有一个Visual Studio 2010解决方案和一个ASP.NET MVC 3解决方案,该解决方案作为Azure服务的Web角色。除此之外,没有附加到服务的其他角色 从我在VisualStudio上单击publish开始,到Azure登台(或生产)环境的每次部署都需要20分钟才能完成,直到所有实例(2)都启动为止 正如您所想象的,这使得经常发布或快速修复某些bug成为了一种PITA。有没有办法加快这个过程?将包上载到反Blob存储并从那里升级会更快吗?我将如何实现这一目标 我觉得Azure
Visual Studio 2010
解决方案和一个ASP.NET MVC 3
解决方案,该解决方案作为Azure服务的Web角色。除此之外,没有附加到服务的其他角色
从我在VisualStudio上单击publish开始,到Azure登台(或生产)环境的每次部署都需要20分钟才能完成,直到所有实例(2)都启动为止
正如您所想象的,这使得经常发布或快速修复某些bug成为了一种PITA。有没有办法加快这个过程?将包上载到反Blob存储并从那里升级会更快吗?我将如何实现这一目标
我觉得Azure上的在线文档还有很多需要改进的地方。特别是顺便说一下,当涉及到故障排除时
谢谢。上传本身大部分时间都需要一分钟多一点的时间。实例的启动占用了大部分时间
您可以做的是首先将您的修复程序部署到staging(请注意,这需要花钱,所以不要让它在那里停留太久)。从暂存切换到生产只需几秒钟。因此,当您的应用程序仍在运行时,您可以上传补丁版本,让您的测试人员在登台时对其进行测试,当他们批准时,只需将其切换到生产环境即可
我还没有通过先上传到blob存储来测试您可能的替代方法。但我认为这会增加开销,因为它不会加快实例的启动速度。首先尝试将项目上载到blob存储是个不错的主意,但不幸的是,Visual Studio在幕后为您做的就是这样。正如其他地方指出的,部署的大部分时间不是上载本身,而是停止和启动所有更新域
如果您只是在一个开发环境中运行这个站点,那么我所知道的加速它的唯一方法就是只运行一个实例。如果这是生活环境,那么。。。对不起,我想你运气不好
因此,我不必部署到云端来测试微小的更改,我发现可以很好地对站点进行工程设计,使其在本地IIS中运行时与任何其他MVC站点一样工作
这项工作的最大障碍是云配置中的设置。我们解决这个问题的方法是复制云配置中的所有设置,并将它们放在appSettings中的web.config中。然后,不要使用RoleEnvironment.GetConfigurationSettingValue()
而是创建一个您调用的包装类。此包装类检查RoleEnvironment.IsAvailable
以查看它是否在Azure结构中运行,如果是,则调用上面的常规配置函数,如果不是,则调用WebConfigurationManager.AppSettings[]
关于获取配置设置更改事件,您还需要做一些其他事情,希望您可以从下面的代码中了解这些事情:
public class SmartConfigurationManager
{
private static bool _addConfigChangeEvents;
private static string _configName;
private static Func<string, bool> _configSetter;
public static bool AddConfigChangeEvents
{
get { return _addConfigChangeEvents; }
set
{
_addConfigChangeEvents = value;
if (value)
{
RoleEnvironment.Changing += RoleEnvironmentChanging;
}
else
{
RoleEnvironment.Changing -= RoleEnvironmentChanging;
}
}
}
public static string Setting(string configName)
{
if (RoleEnvironment.IsAvailable)
{
return RoleEnvironment.GetConfigurationSettingValue(configName);
}
return WebConfigurationManager.AppSettings[configName];
}
public static Action<string, Func<string, bool>> GetConfigurationSettingPublisher()
{
if (RoleEnvironment.IsAvailable)
{
return AzureSettingsGet;
}
return WebAppSettingsGet;
}
public static void WebAppSettingsGet(string configName, Func<string, bool> configSetter)
{
configSetter(WebConfigurationManager.AppSettings[configName]);
}
public static void AzureSettingsGet(string configName, Func<string, bool> configSetter)
{
// We have to store these to be used in the RoleEnvironment Changed handler
_configName = configName;
_configSetter = configSetter;
// Provide the configSetter with the initial value
configSetter(RoleEnvironment.GetConfigurationSettingValue(configName));
if (AddConfigChangeEvents)
{
RoleEnvironment.Changed += RoleEnvironmentChanged;
}
}
private static void RoleEnvironmentChanged(object anotherSender, RoleEnvironmentChangedEventArgs arg)
{
if ((arg.Changes.OfType<RoleEnvironmentConfigurationSettingChange>().Any(change => change.ConfigurationSettingName == _configName)))
{
if ((_configSetter(RoleEnvironment.GetConfigurationSettingValue(_configName))))
{
RoleEnvironment.RequestRecycle();
}
}
}
private static void RoleEnvironmentChanging(object sender, RoleEnvironmentChangingEventArgs e)
{
// If a configuration setting is changing
if ((e.Changes.Any(change => change is RoleEnvironmentConfigurationSettingChange)))
{
// Set e.Cancel to true to restart this role instance
e.Cancel = true;
}
}
}
公共类SmartConfigurationManager
{
私有静态bool\u addConfigChangeEvents;
私有静态字符串_configName;
专用静态函数configSetter;
公共静态bool AddConfigChangeEvents
{
获取{return\u addConfigChangeEvents;}
设置
{
_addConfigChangeEvents=值;
如果(值)
{
RoleEnvironment.Changing+=RoleEnvironment变更;
}
其他的
{
RoleEnvironment.Changing-=RoleEnvironment变更;
}
}
}
公共静态字符串设置(字符串配置名称)
{
如果(RoleEnvironment.IsAvailable)
{
返回RoleEnvironment.GetConfigurationSettingValue(configName);
}
返回WebConfiguration Manager.AppSettings[configName];
}
公共静态操作GetConfigurationSettingPublisher()
{
如果(RoleEnvironment.IsAvailable)
{
返回AzureSettingsGet;
}
返回WebAppSettingsGet;
}
公共静态无效WebAppSettingsGet(字符串configName,Func configSetter)
{
configSetter(WebConfiguration Manager.AppSettings[configName]);
}
公共静态void AzureSettingsGet(字符串配置名称,函数配置设置器)
{
//我们必须存储这些,以便在RoleEnvironment更改的处理程序中使用
_configName=configName;
_configSetter=configSetter;
//向configSetter提供初始值
configSetter(RoleEnvironment.GetConfigurationSettingValue(configName));
if(AddConfigChangeEvents)
{
RoleEnvironment.Changed+=RoleEnvironment已更改;
}
}
私有静态无效RoleEnvironmentChanged(对象另一个发件人RoleEnvironmentChangedEventArgs arg)
{
if((arg.Changes.OfType().Any(change=>change.configurationsetingname==\u configName)))
{
if(_configSetter(RoleEnvironment.GetConfigurationSettingValue(_configName)))
{
RoleEnvironment.RequestRecycle();
}
}
}
私有静态void RoleEnvironmentChangeing(对象发送方,RoleEnvironmentChangingEventArgs e)
{
//如果配置设置正在更改
如果((e.Changes.Any(change=>change为RoleEnvironmentConfigurationSettingChange)))
{
//将e.Cancel设置为true以重新启动此角色实例
e、 取消=真;
}
}
}
减少重新部署需求(和频率)的一个想法是将静态内容移动到blob存储中,在包的外部。例如,将css和javascript与图像一起移动到blob存储。完成后,您只需重新编译/重新部署.NET代码更改。您可以随时将更新的css上载到blob存储。如果您想在sta中测试此功能