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中测试此功能