Created
June 6, 2014 18:12
-
-
Save jonathanread/6cf93cf3cf4ba3100f08 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
using System.Collections.Generic; | |
using Telerik.Sitefinity.Cloud.WindowsAzure; | |
using Telerik.Sitefinity.Configuration; | |
using Telerik.Sitefinity.Services; | |
namespace SitefinityWebApp | |
{ | |
/// <summary> | |
/// Sitefinity's Windows Azure role entry point. | |
/// </summary> | |
/// <remarks> | |
/// Windows Azure looks for RoleEntryPoint inheritors only in the web role assembly and that is why this class is defined here. | |
/// The functionality goes into the base class - <see cref="AzureWebRoleBase"/>. | |
/// </remarks> | |
public class AzureWebRole : AzureWebRoleBase | |
{ | |
private List<string> _tempUrls = new List<string>(); | |
private int _count = 0; | |
private bool _isModified = false; | |
private List<string> SitefinityInternalEndpointIPs | |
{ | |
get | |
{ | |
var ips = new List<string>(); | |
var currentRole = Microsoft.WindowsAzure.ServiceRuntime.RoleEnvironment.Roles["SitefinityWebApp"]; | |
if (currentRole != null) | |
{ | |
foreach (var instance in currentRole.Instances) | |
{ | |
var internalEndpoint = instance.InstanceEndpoints["SitefinityInternalEndpoint"]; | |
if (internalEndpoint != null) | |
{ | |
ips.Add(internalEndpoint.IPEndpoint.Address.ToString()); | |
} | |
} | |
} | |
return ips; | |
} | |
} | |
private List<string> ServerUrls | |
{ | |
get | |
{ | |
LoadBalancingConfig lbConfig = Config.Get<SystemConfig>().LoadBalancingConfig; | |
var urls = lbConfig.URLS; | |
foreach (var u in urls) | |
{ | |
_tempUrls.Add(u.Value); | |
} | |
_count = _tempUrls.Count; | |
return _tempUrls; | |
} | |
set | |
{ | |
_tempUrls = value; | |
} | |
} | |
public override bool OnStart() | |
{ | |
foreach (string i in SitefinityInternalEndpointIPs) | |
{ | |
if (SitefinityInternalEndpointIPs.Count >= 2 && ServerUrls != null && ServerUrls.Count >= 2) | |
{ | |
if (ServerUrls.Contains(i)) | |
{ | |
continue; | |
} | |
else | |
{ | |
_tempUrls.Add(i); | |
_isModified = true; | |
} | |
} | |
} | |
if (_tempUrls.Count > _count || _isModified) | |
{ | |
ConfigManager manager = Config.GetManager(); | |
SystemConfig section = manager.GetSection<SystemConfig>(); | |
//section.LoadBalancingConfig.URLS = ; | |
//manager.SaveSection(section); | |
} | |
return base.OnStart(); | |
} | |
public override void OnStop() | |
{ | |
List<string> azureIps = SitefinityInternalEndpointIPs; | |
base.OnStop(); | |
} | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Hey Jon. I think the problem with this is that Sitefinity hasn't yet bootstrapped when OnStart() is called, so the Config.Get() is failing. I think what we need to do is let the Global.asax handle the case where a new role instance is coming up. Hopefully the OnStop() will be able to access the configs... I'm not sure there would be another way to update when the role stops, besides just updating the configs in a recurring task.