Хорошая идея - сначала попробовать загрузить свой проект в хранилище BLOB-объектов, но, к сожалению, это то, что Visual Studio в любом случае делает для вас за кулисами. Как указывалось в другом месте, большую часть времени при развертывании выполняет не сама загрузка, а остановка и запуск всех ваших доменов обновлений.
Если вы просто запускаете этот сайт в среде разработки, то я знаю, что единственный способ ускорить его - это запустить только один экземпляр. Если это живая среда, тогда ... извините, я думаю, вам не повезло.
Чтобы мне не приходилось развертываться в облаке для тестирования незначительных изменений, я обнаружил, что неплохо сработает сайт, чтобы он работал при работе в локальном IIS, как и любой другой сайт MVC.
Самым большим препятствием для этой работы являются настройки, которые вы имеете в облачной конфигурации. Чтобы обойти это, нужно сделать копию всех настроек в вашем облачном конфиге и поместить их в ваш web.config в appSettings. Затем вместо использования 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;
}
}
}