Fix: Disable HTTP KeepAlive

To improve support for proxy servers which do not support this
optimisation.
See:
http://discoict.com.au/forum/support/2013/2/connection-issues,-lwt,-updates-etc.aspx
This commit is contained in:
Gary Sharp
2013-02-08 12:32:54 +11:00
parent 8089544dab
commit eb03365513
7 changed files with 684 additions and 655 deletions
+198 -185
View File
@@ -1,185 +1,198 @@
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.IO; using System.IO;
using System.Linq; using System.Linq;
using System.Net; using System.Net;
using System.Text; using System.Text;
using System.Threading.Tasks; using System.Threading.Tasks;
using System.Xml.Linq; using System.Xml.Linq;
using System.Xml.Serialization; using System.Xml.Serialization;
using Disco.Data.Repository; using Disco.Data.Repository;
using Disco.Models.BI.Interop.Community; using Disco.Models.BI.Interop.Community;
using Disco.Services.Tasks; using Disco.Services.Tasks;
using Newtonsoft.Json; using Newtonsoft.Json;
namespace Disco.BI.Interop.Community namespace Disco.BI.Interop.Community
{ {
public static class UpdateCheck public static class UpdateCheck
{ {
private static string UpdateUrl(DiscoDataContext db) private static string UpdateUrl(DiscoDataContext db)
{ {
// Special case for DiscoCommunity Hosting Network // Special case for DiscoCommunity Hosting Network
try try
{ {
var ip = (from addr in Dns.GetHostEntry(Dns.GetHostName()).AddressList var ip = (from addr in Dns.GetHostEntry(Dns.GetHostName()).AddressList
where addr.AddressFamily == System.Net.Sockets.AddressFamily.InterNetwork where addr.AddressFamily == System.Net.Sockets.AddressFamily.InterNetwork
&& addr.ToString().StartsWith("10.131.200.") && addr.ToString().StartsWith("10.131.200.")
select addr).FirstOrDefault(); select addr).FirstOrDefault();
if (ip != null) if (ip != null)
{ {
return "http://hades3:9393/base/DiscoUpdate/V1"; return "http://hades3:9393/base/DiscoUpdate/V1";
} }
} }
catch (Exception) catch (Exception)
{} // Ignore Errors { } // Ignore Errors
return "http://discoict.com.au/base/DiscoUpdate/V1"; return "http://discoict.com.au/base/DiscoUpdate/V1";
} }
public static string CurrentDiscoVersion() public static string CurrentDiscoVersion()
{ {
var AssemblyVersion = typeof(UpdateCheck).Assembly.GetName().Version; var AssemblyVersion = typeof(UpdateCheck).Assembly.GetName().Version;
return string.Format("{0}.{1}.{2:0000}.{3:0000}", AssemblyVersion.Major, AssemblyVersion.Minor, AssemblyVersion.Build, AssemblyVersion.Revision); return string.Format("{0}.{1}.{2:0000}.{3:0000}", AssemblyVersion.Major, AssemblyVersion.Minor, AssemblyVersion.Build, AssemblyVersion.Revision);
} }
public static UpdateResponse Check(DiscoDataContext db, bool UseProxy, ScheduledTaskStatus status = null) public static UpdateResponse Check(DiscoDataContext db, bool UseProxy, ScheduledTaskStatus status = null)
{ {
if (status != null) if (status != null)
status.UpdateStatus(10, "Building Update Request"); status.UpdateStatus(10, "Building Update Request");
var request = BuildRequest(db); var request = BuildRequest(db);
//var requestJson = JsonConvert.SerializeObject(request); //var requestJson = JsonConvert.SerializeObject(request);
if (status != null) if (status != null)
status.UpdateStatus(40, "Sending Request"); status.UpdateStatus(40, "Sending Request");
var DiscoBIVersion = CurrentDiscoVersion(); var DiscoBIVersion = CurrentDiscoVersion();
HttpWebRequest webRequest = (HttpWebRequest)HttpWebRequest.Create(UpdateUrl(db)); HttpWebRequest webRequest = (HttpWebRequest)HttpWebRequest.Create(UpdateUrl(db));
webRequest.ContentType = "application/json";
webRequest.Method = WebRequestMethods.Http.Post; // Added: 2013-02-08 G#
webRequest.UserAgent = string.Format("Disco/{0} (Update)", DiscoBIVersion); // Fix for Proxy Servers which dont support KeepAlive
webRequest.KeepAlive = false;
using (var wrStream = webRequest.GetRequestStream()) // End Added: 2013-02-08 G#
{
XmlSerializer xml = new XmlSerializer(typeof(UpdateRequestV1)); if (!UseProxy)
xml.Serialize(wrStream, request); webRequest.Proxy = new WebProxy();
}
if (status != null) webRequest.ContentType = "application/json";
status.UpdateStatus(50, "Waiting for Response"); webRequest.Method = WebRequestMethods.Http.Post;
using (HttpWebResponse webResponse = (HttpWebResponse)webRequest.GetResponse()) webRequest.UserAgent = string.Format("Disco/{0} (Update)", DiscoBIVersion);
{
if (webResponse.StatusCode == HttpStatusCode.OK) using (var wrStream = webRequest.GetRequestStream())
{ {
if (status != null) XmlSerializer xml = new XmlSerializer(typeof(UpdateRequestV1));
status.UpdateStatus(90, "Reading Response"); xml.Serialize(wrStream, request);
UpdateResponse result; }
using (var wResStream = webResponse.GetResponseStream()) if (status != null)
{ status.UpdateStatus(50, "Waiting for Response");
XmlSerializer xml = new XmlSerializer(typeof(UpdateResponse)); using (HttpWebResponse webResponse = (HttpWebResponse)webRequest.GetResponse())
result = (UpdateResponse)xml.Deserialize(wResStream); {
} if (webResponse.StatusCode == HttpStatusCode.OK)
//var result = JsonConvert.DeserializeObject<UpdateResponse>(responseContent); {
db.DiscoConfiguration.UpdateLastCheck = result; if (status != null)
db.SaveChanges(); status.UpdateStatus(90, "Reading Response");
UpdateResponse result;
status.SetFinishedMessage(string.Format("The update server reported Version {0} is the latest.", result.Version)); using (var wResStream = webResponse.GetResponseStream())
{
return result; XmlSerializer xml = new XmlSerializer(typeof(UpdateResponse));
} result = (UpdateResponse)xml.Deserialize(wResStream);
else }
{ //var result = JsonConvert.DeserializeObject<UpdateResponse>(responseContent);
if (status != null) db.DiscoConfiguration.UpdateLastCheck = result;
status.SetTaskException(new WebException(string.Format("Server responded with: [{0}] {1}", webResponse.StatusCode, webResponse.StatusDescription))); db.SaveChanges();
return null;
} status.SetFinishedMessage(string.Format("The update server reported Version {0} is the latest.", result.Version));
}
} return result;
}
private static UpdateRequestV1 BuildRequest(DiscoDataContext db) else
{ {
var m = new UpdateRequestV1(); if (status != null)
status.SetTaskException(new WebException(string.Format("Server responded with: [{0}] {1}", webResponse.StatusCode, webResponse.StatusDescription)));
m.DeploymentId = db.DiscoConfiguration.DeploymentId; return null;
}
m.CurrentDiscoVersion = CurrentDiscoVersion(); }
}
m.OrganisationName = db.DiscoConfiguration.OrganisationName;
m.BroadbandDoeWanId = GetBroadbandDoeWanId(); private static UpdateRequestV1 BuildRequest(DiscoDataContext db)
m.BetaDeployment = db.DiscoConfiguration.UpdateBetaDeployment; {
var m = new UpdateRequestV1();
m.Stat_JobCounts = db.Jobs.GroupBy(j => j.JobTypeId).Select(g => new Disco.Models.BI.Interop.Community.UpdateRequestV1.Stat { Key = g.Key, Count = g.Count() }).ToList();
m.Stat_OpenJobCounts = db.Jobs.Where(j => j.ClosedDate == null).GroupBy(j => j.JobTypeId).Select(g => new Disco.Models.BI.Interop.Community.UpdateRequestV1.Stat { Key = g.Key, Count = g.Count() }).ToList(); m.DeploymentId = db.DiscoConfiguration.DeploymentId;
var activeThreshold = DateTime.Now.AddDays(-60);
m.Stat_ActiveDeviceModelCounts = db.DeviceModels.Select(dm => new Disco.Models.BI.Interop.Community.UpdateRequestV1.Stat { Key = dm.Manufacturer + ";" + dm.Model, Count = dm.Devices.Count(d => d.DecommissionedDate == null && (d.LastNetworkLogonDate == null || d.LastNetworkLogonDate > activeThreshold)) }).ToList(); m.CurrentDiscoVersion = CurrentDiscoVersion();
m.Stat_UserCounts = db.Users.GroupBy(u => u.Type).Select(g => new Disco.Models.BI.Interop.Community.UpdateRequestV1.Stat { Key = g.Key, Count = g.Count() }).ToList();
m.OrganisationName = db.DiscoConfiguration.OrganisationName;
return m; m.BroadbandDoeWanId = GetBroadbandDoeWanId();
} m.BetaDeployment = db.DiscoConfiguration.UpdateBetaDeployment;
#region DoE Query m.Stat_JobCounts = db.Jobs.GroupBy(j => j.JobTypeId).Select(g => new Disco.Models.BI.Interop.Community.UpdateRequestV1.Stat { Key = g.Key, Count = g.Count() }).ToList();
public static string GetBroadbandDoeWanId() m.Stat_OpenJobCounts = db.Jobs.Where(j => j.ClosedDate == null).GroupBy(j => j.JobTypeId).Select(g => new Disco.Models.BI.Interop.Community.UpdateRequestV1.Stat { Key = g.Key, Count = g.Count() }).ToList();
{ var activeThreshold = DateTime.Now.AddDays(-60);
// DnsQuery for broadband.doe.wan m.Stat_ActiveDeviceModelCounts = db.DeviceModels.Select(dm => new Disco.Models.BI.Interop.Community.UpdateRequestV1.Stat { Key = dm.Manufacturer + ";" + dm.Model, Count = dm.Devices.Count(d => d.DecommissionedDate == null && (d.LastNetworkLogonDate == null || d.LastNetworkLogonDate > activeThreshold)) }).ToList();
IPHostEntry doeWanDnsEntry; m.Stat_UserCounts = db.Users.GroupBy(u => u.Type).Select(g => new Disco.Models.BI.Interop.Community.UpdateRequestV1.Stat { Key = g.Key, Count = g.Count() }).ToList();
try
{ return m;
doeWanDnsEntry = Dns.GetHostEntry("broadband.doe.wan"); }
}
catch (Exception) #region DoE Query
{ return null; } // Fail on error public static string GetBroadbandDoeWanId()
{
// Try using IPSearch feature // DnsQuery for broadband.doe.wan
XDocument doeWanIPSearchResult = TryDownloadDoeIPSearch(false); IPHostEntry doeWanDnsEntry;
if (doeWanIPSearchResult == null) try
doeWanIPSearchResult = TryDownloadDoeIPSearch(true); {
doeWanDnsEntry = Dns.GetHostEntry("broadband.doe.wan");
if (doeWanIPSearchResult == null) }
return null; catch (Exception)
{ return null; } // Fail on error
try
{ // Try using IPSearch feature
return doeWanIPSearchResult.Element("resultset").Element("site").Element("number").Value.ToLower(); XDocument doeWanIPSearchResult = TryDownloadDoeIPSearch(false);
} if (doeWanIPSearchResult == null)
catch (Exception) doeWanIPSearchResult = TryDownloadDoeIPSearch(true);
{ return null; } // Fail on error
} if (doeWanIPSearchResult == null)
private static XDocument TryDownloadDoeIPSearch(bool useProxy) return null;
{
try try
{ {
var DiscoBIVersion = CurrentDiscoVersion(); return doeWanIPSearchResult.Element("resultset").Element("site").Element("number").Value.ToLower();
}
HttpWebRequest wReq = (HttpWebRequest)HttpWebRequest.Create("http://broadband.doe.wan/ipsearch/showresult.php"); catch (Exception)
if (!useProxy) { return null; } // Fail on error
wReq.Proxy = new WebProxy(); // Empty Proxy Config }
wReq.Method = WebRequestMethods.Http.Post; private static XDocument TryDownloadDoeIPSearch(bool useProxy)
wReq.ContentType = "application/x-www-form-urlencoded"; {
wReq.UserAgent = string.Format("Disco/{0}", DiscoBIVersion); try
using (var wrStream = wReq.GetRequestStream()) {
{ var DiscoBIVersion = CurrentDiscoVersion();
using (var wrStreamWriter = new StreamWriter(wrStream))
{ HttpWebRequest wReq = (HttpWebRequest)HttpWebRequest.Create("http://broadband.doe.wan/ipsearch/showresult.php");
wrStreamWriter.Write("mode=whoami"); // Added: 2013-02-08 G#
} // Fix for Proxy Servers which dont support KeepAlive
} webRequest.KeepAlive = false;
using (HttpWebResponse wRes = (HttpWebResponse)wReq.GetResponse()) // End Added: 2013-02-08 G#
{ if (!useProxy)
if (wRes.StatusCode == HttpStatusCode.OK) wReq.Proxy = new WebProxy(); // Empty Proxy Config
{ wReq.Method = WebRequestMethods.Http.Post;
using (var wResStream = wRes.GetResponseStream()) wReq.ContentType = "application/x-www-form-urlencoded";
{ wReq.UserAgent = string.Format("Disco/{0}", DiscoBIVersion);
return XDocument.Load(wResStream); using (var wrStream = wReq.GetRequestStream())
} {
} using (var wrStreamWriter = new StreamWriter(wrStream))
else {
return null; wrStreamWriter.Write("mode=whoami");
} }
} }
catch (Exception) using (HttpWebResponse wRes = (HttpWebResponse)wReq.GetResponse())
{ return null; } // Fail on error {
} if (wRes.StatusCode == HttpStatusCode.OK)
#endregion {
using (var wResStream = wRes.GetResponseStream())
} {
} return XDocument.Load(wResStream);
}
}
else
return null;
}
}
catch (Exception)
{ return null; } // Fail on error
}
#endregion
}
}
@@ -1,86 +1,87 @@
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Linq; using System.Linq;
using System.Text; using System.Text;
using System.Threading.Tasks; using System.Threading.Tasks;
using Disco.Data.Repository; using Disco.Data.Repository;
using Disco.Services.Logging; using Disco.Services.Logging;
using Disco.Services.Tasks; using Disco.Services.Tasks;
using Quartz; using Quartz;
namespace Disco.BI.Interop.Community namespace Disco.BI.Interop.Community
{ {
public class UpdateCheckTask : ScheduledTask public class UpdateCheckTask : ScheduledTask
{ {
public override string TaskName { get { return "Disco Community - Check for Update"; } } public override string TaskName { get { return "Disco Community - Check for Update"; } }
public override bool SingleInstanceTask { get { return true; } } public override bool SingleInstanceTask { get { return true; } }
public override bool CancelInitiallySupported { get { return false; } } public override bool CancelInitiallySupported { get { return false; } }
public static ScheduledTaskStatus ScheduleNow() public static ScheduledTaskStatus ScheduleNow()
{ {
var runningTasks = ScheduledTasks.GetTaskStatuses(typeof(UpdateCheckTask)).Where(ts => ts.IsRunning).ToList(); var runningTasks = ScheduledTasks.GetTaskStatuses(typeof(UpdateCheckTask)).Where(ts => ts.IsRunning).ToList();
if (runningTasks.Count > 0) if (runningTasks.Count > 0)
return runningTasks.First(); return runningTasks.First();
else else
{ {
var t = new UpdateCheckTask(); var t = new UpdateCheckTask();
return t.ScheduleTask(); return t.ScheduleTask();
} }
} }
public static ScheduledTaskStatus RunningStatus public static ScheduledTaskStatus RunningStatus
{ {
get get
{ {
return ScheduledTasks.GetTaskStatuses(typeof(UpdateCheckTask)).Where(ts => ts.IsRunning).FirstOrDefault(); return ScheduledTasks.GetTaskStatuses(typeof(UpdateCheckTask)).Where(ts => ts.IsRunning).FirstOrDefault();
} }
} }
public static DateTime? NextScheduled public static DateTime? NextScheduled
{ {
get get
{ {
var runningTasks = ScheduledTasks.GetTaskStatuses(typeof(UpdateCheckTask)).ToList(); var runningTasks = ScheduledTasks.GetTaskStatuses(typeof(UpdateCheckTask)).ToList();
DateTime timestamp = DateTime.MaxValue; DateTime timestamp = DateTime.MaxValue;
foreach (var t in runningTasks) foreach (var t in runningTasks)
{ {
if (t.NextScheduledTimestamp != null && t.NextScheduledTimestamp.Value < timestamp) if (t.NextScheduledTimestamp != null && t.NextScheduledTimestamp.Value < timestamp)
timestamp = t.NextScheduledTimestamp.Value; timestamp = t.NextScheduledTimestamp.Value;
} }
if (timestamp == DateTime.MaxValue) if (timestamp == DateTime.MaxValue)
return null; return null;
else else
return timestamp; return timestamp;
} }
} }
public override void InitalizeScheduledTask(Data.Repository.DiscoDataContext dbContext) public override void InitalizeScheduledTask(Data.Repository.DiscoDataContext dbContext)
{ {
// ActiveDirectoryUpdateLastNetworkLogonDateJob @ 11:30pm // ActiveDirectoryUpdateLastNetworkLogonDateJob @ 11:30pm
var rnd = new Random(); var rnd = new Random();
var rndHour = rnd.Next(12, 23); var rndHour = rnd.Next(12, 23);
var rndMinute = rnd.Next(0, 59); var rndMinute = rnd.Next(0, 59);
TriggerBuilder triggerBuilder = TriggerBuilder.Create(). TriggerBuilder triggerBuilder = TriggerBuilder.Create().
WithSchedule(CronScheduleBuilder.DailyAtHourAndMinute(rndHour, rndMinute)); WithSchedule(CronScheduleBuilder.DailyAtHourAndMinute(rndHour, rndMinute));
this.ScheduleTask(triggerBuilder); this.ScheduleTask(triggerBuilder);
} }
protected override void ExecuteTask() protected override void ExecuteTask()
{ {
using (DiscoDataContext db = new DiscoDataContext()) using (DiscoDataContext db = new DiscoDataContext())
{ {
try try
{ {
UpdateCheck.Check(db, true, this.Status); UpdateCheck.Check(db, true, this.Status);
} }
catch (Exception) catch (Exception ex)
{ {
// Could be proxy error - try again without proxy: ScheduledTasksLog.LogScheduledTaskException(this.Status.TaskName, this.Status.SessionId, this.Status.TaskType, ex);
UpdateCheck.Check(db, false, this.Status); // Could be proxy error - try again without proxy:
} UpdateCheck.Check(db, false, this.Status);
} }
} }
} }
} }
}
+2 -2
View File
@@ -32,5 +32,5 @@ using System.Runtime.InteropServices;
// You can specify all the values or you can default the Build and Revision Numbers // You can specify all the values or you can default the Build and Revision Numbers
// by using the '*' as shown below: // by using the '*' as shown below:
// [assembly: AssemblyVersion("1.0.*")] // [assembly: AssemblyVersion("1.0.*")]
[assembly: AssemblyVersion("1.2.0207.1853")] [assembly: AssemblyVersion("1.2.0208.1156")]
[assembly: AssemblyFileVersion("1.2.0207.1853")] [assembly: AssemblyFileVersion("1.2.0208.1156")]
+211 -204
View File
@@ -1,205 +1,212 @@
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Diagnostics; using System.Diagnostics;
using System.Linq; using System.Linq;
using System.Net; using System.Net;
using System.Security.Principal; using System.Security.Principal;
using System.Web; using System.Web;
using System.Web.Http; using System.Web.Http;
using System.Web.Mvc; using System.Web.Mvc;
using System.Web.Routing; using System.Web.Routing;
using Disco.Data.Repository; using Disco.Data.Repository;
using Disco.Models.Repository; using Disco.Models.Repository;
namespace Disco.Web namespace Disco.Web
{ {
// Note: For instructions on enabling IIS6 or IIS7 classic mode, // Note: For instructions on enabling IIS6 or IIS7 classic mode,
// visit http://go.microsoft.com/?LinkId=9394801 // visit http://go.microsoft.com/?LinkId=9394801
public class DiscoApplication : System.Web.HttpApplication public class DiscoApplication : System.Web.HttpApplication
{ {
public DiscoApplication() public DiscoApplication()
{ {
base.AuthenticateRequest += new EventHandler(DiscoApplication_AuthenticateRequest); base.AuthenticateRequest += new EventHandler(DiscoApplication_AuthenticateRequest);
base.BeginRequest += new EventHandler(DiscoApplication_BeginRequest); base.BeginRequest += new EventHandler(DiscoApplication_BeginRequest);
base.Error += new EventHandler(DiscoApplication_Error); base.Error += new EventHandler(DiscoApplication_Error);
} }
protected void Application_Start() protected void Application_Start()
{ {
var timer = new Stopwatch(); var timer = new Stopwatch();
long timer_last; long timer_last;
timer.Start(); timer.Start();
Debug.WriteLine("Application Startup Profiling Started"); Debug.WriteLine("Application Startup Profiling Started");
timer_last = timer.ElapsedMilliseconds; timer_last = timer.ElapsedMilliseconds;
if (AppConfig.InitializeDatabase()) if (AppConfig.InitializeDatabase())
{ {
Debug.WriteLine("Initialized Database: +{0}ms", timer.ElapsedMilliseconds - timer_last); Debug.WriteLine("Initialized Database: +{0}ms", timer.ElapsedMilliseconds - timer_last);
timer_last = timer.ElapsedMilliseconds; timer_last = timer.ElapsedMilliseconds;
AreaRegistration.RegisterAllAreas(); AreaRegistration.RegisterAllAreas();
Debug.WriteLine("Registered Areas: +{0}ms", timer.ElapsedMilliseconds - timer_last); Debug.WriteLine("Registered Areas: +{0}ms", timer.ElapsedMilliseconds - timer_last);
timer_last = timer.ElapsedMilliseconds; timer_last = timer.ElapsedMilliseconds;
WebApiConfig.Register(GlobalConfiguration.Configuration); WebApiConfig.Register(GlobalConfiguration.Configuration);
Debug.WriteLine("Registered API: +{0}ms", timer.ElapsedMilliseconds - timer_last); Debug.WriteLine("Registered API: +{0}ms", timer.ElapsedMilliseconds - timer_last);
timer_last = timer.ElapsedMilliseconds; timer_last = timer.ElapsedMilliseconds;
FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters); FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
Debug.WriteLine("Registered Global Filters: +{0}ms", timer.ElapsedMilliseconds - timer_last); Debug.WriteLine("Registered Global Filters: +{0}ms", timer.ElapsedMilliseconds - timer_last);
timer_last = timer.ElapsedMilliseconds; timer_last = timer.ElapsedMilliseconds;
RouteConfig.RegisterRoutes(RouteTable.Routes); RouteConfig.RegisterRoutes(RouteTable.Routes);
Debug.WriteLine("Registered Routes: +{0}ms", timer.ElapsedMilliseconds - timer_last); Debug.WriteLine("Registered Routes: +{0}ms", timer.ElapsedMilliseconds - timer_last);
timer_last = timer.ElapsedMilliseconds; timer_last = timer.ElapsedMilliseconds;
BundleConfig.RegisterBundles(); BundleConfig.RegisterBundles();
Debug.WriteLine("Registered Bundles: +{0}ms", timer.ElapsedMilliseconds - timer_last); Debug.WriteLine("Registered Bundles: +{0}ms", timer.ElapsedMilliseconds - timer_last);
timer_last = timer.ElapsedMilliseconds; timer_last = timer.ElapsedMilliseconds;
AppConfig.InitalizeEnvironment(); AppConfig.InitalizeEnvironment();
Debug.WriteLine("Initialized Environment: +{0}ms", timer.ElapsedMilliseconds - timer_last); Debug.WriteLine("Initialized Environment: +{0}ms", timer.ElapsedMilliseconds - timer_last);
timer_last = timer.ElapsedMilliseconds; timer_last = timer.ElapsedMilliseconds;
} }
else else
{ {
// Install // Install
InitialConfig = true; InitialConfig = true;
RouteConfig.RegisterInstallRoutes(RouteTable.Routes); RouteConfig.RegisterInstallRoutes(RouteTable.Routes);
BundleConfig.RegisterBundles(); BundleConfig.RegisterBundles();
} }
} }
protected void Application_End() protected void Application_End()
{ {
AppConfig.DisposeEnvironment(); AppConfig.DisposeEnvironment();
} }
void DiscoApplication_BeginRequest(object sender, EventArgs e) void DiscoApplication_BeginRequest(object sender, EventArgs e)
{ {
// Force Disable IE Compatibility Mode // Force Disable IE Compatibility Mode
Response.Headers.Add("X-UA-Compatible", "IE=edge"); Response.Headers.Add("X-UA-Compatible", "IE=edge");
} }
#region Authentication #region Authentication
void DiscoApplication_AuthenticateRequest(object sender, EventArgs e) void DiscoApplication_AuthenticateRequest(object sender, EventArgs e)
{ {
User u = CurrentUser; User u = CurrentUser;
if (u != null) if (u != null)
{ {
base.Context.User = new GenericPrincipal(base.Context.User.Identity, new string[] { u.Type }); base.Context.User = new GenericPrincipal(base.Context.User.Identity, new string[] { u.Type });
} }
} }
public static bool InitialConfig { get; set; } public static bool InitialConfig { get; set; }
public static User CurrentUser public static User CurrentUser
{ {
get get
{ {
if (!InitialConfig) if (!InitialConfig)
return BI.UserBI.UserCache.CurrentUser; return BI.UserBI.UserCache.CurrentUser;
else else
return null; return null;
} }
} }
#endregion #endregion
#region Cached Properties #region Cached Properties
private static string _OrganisationName; private static string _OrganisationName;
public static string OrganisationName public static string OrganisationName
{ {
get get
{ {
if (string.IsNullOrWhiteSpace(_OrganisationName)) if (string.IsNullOrWhiteSpace(_OrganisationName))
{ {
return "Unknown"; return "Unknown";
} }
return _OrganisationName; return _OrganisationName;
} }
set set
{ {
_OrganisationName = value; _OrganisationName = value;
} }
} }
public static bool MultiSiteMode { get; set; } public static bool MultiSiteMode { get; set; }
#region Version #region Version
private static Lazy<string> _Version = new Lazy<string>(() => private static Lazy<string> _Version = new Lazy<string>(() =>
{ {
var AssemblyVersion = typeof(DiscoApplication).Assembly.GetName().Version; var AssemblyVersion = typeof(DiscoApplication).Assembly.GetName().Version;
return string.Format("{0}.{1}.{2:0000}", AssemblyVersion.Major, AssemblyVersion.Minor, AssemblyVersion.Build); return string.Format("{0}.{1}.{2:0000}", AssemblyVersion.Major, AssemblyVersion.Minor, AssemblyVersion.Build);
}); });
public static string Version public static string Version
{ {
get get
{ {
return _Version.Value; return _Version.Value;
} }
} }
#endregion #endregion
#endregion #endregion
#region Proxy #region Proxy
private static IWebProxy _defaultProxy; private static IWebProxy _defaultProxy;
public static void SetGlobalProxy(string Address, int Port, string Username, string Password) public static void SetGlobalProxy(string Address, int Port, string Username, string Password)
{ {
if (_defaultProxy == null) if (_defaultProxy == null)
{ {
_defaultProxy = WebRequest.DefaultWebProxy; _defaultProxy = WebRequest.DefaultWebProxy;
} }
if (!string.IsNullOrWhiteSpace(Address)) if (!string.IsNullOrWhiteSpace(Address))
{ {
WebProxy p = new WebProxy(new Uri(string.Format("http://{0}:{1}", Address, Port))); WebProxy p = new WebProxy(Address, Port);
if (!string.IsNullOrWhiteSpace(Username)) p.BypassProxyOnLocal = true;
{ if (!string.IsNullOrWhiteSpace(Username))
p.Credentials = new NetworkCredential(Username, Password); {
} p.Credentials = new NetworkCredential(Username, Password);
WebRequest.DefaultWebProxy = p; }
} else
else {
{ // Added 2013-02-08 G#
WebRequest.DefaultWebProxy = _defaultProxy; // Improve support for Integrated Windows Authentication
} p.UseDefaultCredentials = true;
} }
#endregion WebRequest.DefaultWebProxy = p;
#region Scheduler Factory }
private static Lazy<Quartz.ISchedulerFactory> _SchedulerFactory = new Lazy<Quartz.ISchedulerFactory>(() => else
{ {
// Initialize Scheduler Factory WebRequest.DefaultWebProxy = _defaultProxy;
return new Quartz.Impl.StdSchedulerFactory(); }
}); }
public static Quartz.ISchedulerFactory SchedulerFactory #endregion
{ #region Scheduler Factory
get private static Lazy<Quartz.ISchedulerFactory> _SchedulerFactory = new Lazy<Quartz.ISchedulerFactory>(() =>
{ {
return _SchedulerFactory.Value; // Initialize Scheduler Factory
} return new Quartz.Impl.StdSchedulerFactory();
} });
#endregion public static Quartz.ISchedulerFactory SchedulerFactory
#region Dropbox Monitor {
public static BI.DocumentTemplateBI.Importer.DocumentDropBoxMonitor DocumentDropBoxMonitor { get; set; } get
#endregion {
#region Global Error Logging return _SchedulerFactory.Value;
void DiscoApplication_Error(object sender, EventArgs e) }
{ }
try #endregion
{ #region Dropbox Monitor
Disco.Services.Logging.SystemLog.LogException("Global Application Exception Caught", Server.GetLastError()); public static BI.DocumentTemplateBI.Importer.DocumentDropBoxMonitor DocumentDropBoxMonitor { get; set; }
} #endregion
catch (Exception) #region Global Error Logging
{ void DiscoApplication_Error(object sender, EventArgs e)
// Ignore all logging errors {
} try
} {
#endregion Disco.Services.Logging.SystemLog.LogException("Global Application Exception Caught", Server.GetLastError());
} }
catch (Exception)
{
// Ignore all logging errors
}
}
#endregion
}
} }
+91 -87
View File
@@ -1,88 +1,92 @@
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Linq; using System.Linq;
using System.Web; using System.Web;
using System.Net; using System.Net;
using System.IO; using System.IO;
namespace Disco.Web.Models.InitialConfig namespace Disco.Web.Models.InitialConfig
{ {
public class CompleteModel public class CompleteModel
{ {
public Tuple<IPHostEntry, Exception> DiscoDnsTestResult { get; set; } public Tuple<IPHostEntry, Exception> DiscoDnsTestResult { get; set; }
public Exception RegistryDatabaseResult { get; set; } public Exception RegistryDatabaseResult { get; set; }
public Exception DiscoIctComAuWebResult { get; set; } public Exception DiscoIctComAuWebResult { get; set; }
public bool LaunchAllowed public bool LaunchAllowed
{ {
get get
{ {
return (RegistryDatabaseResult == null); return (RegistryDatabaseResult == null);
} }
} }
public void PerformTests() public void PerformTests()
{ {
#region DNS for 'Disco' #region DNS for 'Disco'
try try
{ {
// Try and Resolve 'disco' // Try and Resolve 'disco'
DiscoDnsTestResult = new Tuple<IPHostEntry, Exception>(Dns.GetHostEntry("disco"), null); DiscoDnsTestResult = new Tuple<IPHostEntry, Exception>(Dns.GetHostEntry("disco"), null);
} }
catch (Exception ex) catch (Exception ex)
{ {
DiscoDnsTestResult = new Tuple<IPHostEntry, Exception>(null, ex); DiscoDnsTestResult = new Tuple<IPHostEntry, Exception>(null, ex);
} }
#endregion #endregion
#region Write Database to Registry #region Write Database to Registry
try try
{ {
// Make Connection String Persistent // Make Connection String Persistent
Disco.Data.Repository.DiscoDatabaseConnectionFactory.SetDiscoDataContextConnectionString( Disco.Data.Repository.DiscoDatabaseConnectionFactory.SetDiscoDataContextConnectionString(
Disco.Data.Repository.DiscoDatabaseConnectionFactory.DiscoDataContextConnectionString, true); Disco.Data.Repository.DiscoDatabaseConnectionFactory.DiscoDataContextConnectionString, true);
RegistryDatabaseResult = null; RegistryDatabaseResult = null;
} }
catch (Exception ex) catch (Exception ex)
{ {
RegistryDatabaseResult = ex; RegistryDatabaseResult = ex;
} }
#endregion #endregion
#region Communicate with http://discoict.com.au/ #region Communicate with http://discoict.com.au/
try try
{ {
Dns.GetHostEntry("discoict.com.au"); Dns.GetHostEntry("discoict.com.au");
try try
{ {
HttpWebRequest wReq = (HttpWebRequest)HttpWebRequest.Create("http://discoict.com.au/"); HttpWebRequest wReq = (HttpWebRequest)HttpWebRequest.Create("http://discoict.com.au/");
wReq.Method = WebRequestMethods.Http.Get; // Added: 2013-02-08 G#
wReq.UserAgent = string.Format("Disco/{0} (Initial Config; Org: {1})", DiscoApplication.Version, DiscoApplication.OrganisationName); // Fix for Proxy Servers which dont support KeepAlive
using (HttpWebResponse wRes = (HttpWebResponse)wReq.GetResponse()) wReq.KeepAlive = false;
{ // End Added: 2013-02-08 G#
if (wRes.StatusCode == HttpStatusCode.OK) wReq.Method = WebRequestMethods.Http.Get;
{ wReq.UserAgent = string.Format("Disco/{0} (Initial Config; Org: {1})", DiscoApplication.Version, DiscoApplication.OrganisationName);
DiscoIctComAuWebResult = null; using (HttpWebResponse wRes = (HttpWebResponse)wReq.GetResponse())
} {
else if (wRes.StatusCode == HttpStatusCode.OK)
{ {
DiscoIctComAuWebResult = new Exception(string.Format("Server returned response: [{0}] {1}", wRes.StatusCode, wRes.StatusDescription)); DiscoIctComAuWebResult = null;
} }
} else
} {
catch (Exception ex) DiscoIctComAuWebResult = new Exception(string.Format("Server returned response: [{0}] {1}", wRes.StatusCode, wRes.StatusDescription));
{ }
DiscoIctComAuWebResult = new WebException("DNS Resolved the host 'discoict.com.au' but could not establish a connection.", ex); }
} }
} catch (Exception ex)
catch (Exception ex) {
{ DiscoIctComAuWebResult = new WebException("DNS Resolved the host 'discoict.com.au' but could not establish a connection.", ex);
DiscoIctComAuWebResult = new Exception("Could not resolve the name 'discoict.com.au'", ex); }
throw; }
} catch (Exception ex)
#endregion {
DiscoIctComAuWebResult = new Exception("Could not resolve the name 'discoict.com.au'", ex);
} throw;
} }
#endregion
}
}
} }
+93 -89
View File
@@ -1,90 +1,94 @@
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations;
using System.Linq; using System.Linq;
using System.Web; using System.Web;
using System.Net; using System.Net;
using System.Xml.Linq; using System.Xml.Linq;
using System.IO; using System.IO;
using System.Globalization; using System.Globalization;
namespace Disco.Web.Models.InitialConfig namespace Disco.Web.Models.InitialConfig
{ {
public class WelcomeModel public class WelcomeModel
{ {
[Required(ErrorMessage="The Organisation Name is required.")] [Required(ErrorMessage="The Organisation Name is required.")]
public string OrganisationName { get; set; } public string OrganisationName { get; set; }
private static string _OrganisationNameCache; private static string _OrganisationNameCache;
public bool AutodetectOrganisation() public bool AutodetectOrganisation()
{ {
if (_OrganisationNameCache != null) if (_OrganisationNameCache != null)
{ {
this.OrganisationName = _OrganisationNameCache; this.OrganisationName = _OrganisationNameCache;
return true; return true;
} }
// DnsQuery for broadband.doe.wan // DnsQuery for broadband.doe.wan
IPHostEntry doeWanDnsEntry; IPHostEntry doeWanDnsEntry;
try try
{ {
doeWanDnsEntry = Dns.GetHostEntry("broadband.doe.wan"); doeWanDnsEntry = Dns.GetHostEntry("broadband.doe.wan");
} }
catch (Exception) catch (Exception)
{ return false; } // Fail on error { return false; } // Fail on error
// Try using IPSearch feature // Try using IPSearch feature
XDocument doeWanIPSearchResult = TryDownloadDoeIPSearch(true); XDocument doeWanIPSearchResult = TryDownloadDoeIPSearch(true);
if (doeWanIPSearchResult == null) if (doeWanIPSearchResult == null)
doeWanIPSearchResult = TryDownloadDoeIPSearch(false); doeWanIPSearchResult = TryDownloadDoeIPSearch(false);
if (doeWanIPSearchResult == null) if (doeWanIPSearchResult == null)
return false; return false;
try try
{ {
var siteName = doeWanIPSearchResult.Element("resultset").Element("site").Element("name").Value.ToLower(); var siteName = doeWanIPSearchResult.Element("resultset").Element("site").Element("name").Value.ToLower();
this.OrganisationName = CultureInfo.CurrentCulture.TextInfo.ToTitleCase(siteName); this.OrganisationName = CultureInfo.CurrentCulture.TextInfo.ToTitleCase(siteName);
_OrganisationNameCache = this.OrganisationName; _OrganisationNameCache = this.OrganisationName;
return true; return true;
} }
catch (Exception) catch (Exception)
{ return false; } // Fail on error { return false; } // Fail on error
} }
private XDocument TryDownloadDoeIPSearch(bool useProxy) private XDocument TryDownloadDoeIPSearch(bool useProxy)
{ {
try try
{ {
HttpWebRequest wReq = (HttpWebRequest)HttpWebRequest.Create("http://broadband.doe.wan/ipsearch/showresult.php"); HttpWebRequest wReq = (HttpWebRequest)HttpWebRequest.Create("http://broadband.doe.wan/ipsearch/showresult.php");
if (!useProxy) // Added: 2013-02-08 G#
wReq.Proxy = new WebProxy(); // Empty Proxy Config // Fix for Proxy Servers which dont support KeepAlive
wReq.Method = WebRequestMethods.Http.Post; wReq.KeepAlive = false;
wReq.ContentType = "application/x-www-form-urlencoded"; // End Added: 2013-02-08 G#
wReq.UserAgent = string.Format("Disco/{0}", DiscoApplication.Version); if (!useProxy)
using (var wrStream = wReq.GetRequestStream()) wReq.Proxy = new WebProxy(); // Empty Proxy Config
{ wReq.Method = WebRequestMethods.Http.Post;
using (var wrStreamWriter = new StreamWriter(wrStream)) wReq.ContentType = "application/x-www-form-urlencoded";
{ wReq.UserAgent = string.Format("Disco/{0}", DiscoApplication.Version);
wrStreamWriter.Write("mode=whoami"); using (var wrStream = wReq.GetRequestStream())
} {
} using (var wrStreamWriter = new StreamWriter(wrStream))
using (HttpWebResponse wRes = (HttpWebResponse)wReq.GetResponse()) {
{ wrStreamWriter.Write("mode=whoami");
if (wRes.StatusCode == HttpStatusCode.OK) }
{ }
using (var wResStream = wRes.GetResponseStream()) using (HttpWebResponse wRes = (HttpWebResponse)wReq.GetResponse())
{ {
return XDocument.Load(wResStream); if (wRes.StatusCode == HttpStatusCode.OK)
} {
} using (var wResStream = wRes.GetResponseStream())
else {
return null; return XDocument.Load(wResStream);
} }
} }
catch (Exception) else
{ return null; } // Fail on error return null;
} }
}
} catch (Exception)
{ return null; } // Fail on error
}
}
} }
+2 -2
View File
@@ -31,5 +31,5 @@ using System.Runtime.InteropServices;
// //
// You can specify all the values or you can default the Revision and Build Numbers // You can specify all the values or you can default the Revision and Build Numbers
// by using the '*' as shown below: // by using the '*' as shown below:
[assembly: AssemblyVersion("1.2.0207.1727")] [assembly: AssemblyVersion("1.2.0208.1156")]
[assembly: AssemblyFileVersion("1.2.0207.1727")] [assembly: AssemblyFileVersion("1.2.0208.1156")]