// Derived from http://blogs.msdn.com/b/carlosag/archive/2011/01/21/get-iis-bindings-at-runtime-without-being-an-administrator.aspx. // Since we want this method to work from within web applications, it's important to use WebConfigurationManager instead of ServerManager. See Dominick // Baier's post: http://leastprivilege.com/2007/01/09/iis7-configuration-api/. internal static string GetFirstBaseUrlForCurrentSite(bool iisExpress) { var assembly = getAssembly(iisExpress); var configurationManagerClass = assembly.GetType("Microsoft.Web.Administration.WebConfigurationManager"); var getSectionMethod = configurationManagerClass.GetMethod("GetSection", new[] { typeof(string), typeof(string), typeof(string) }); dynamic sitesSection = getSectionMethod.Invoke(null, new object[] { null, null, "system.applicationHost/sites" }); var site = ((IEnumerable <dynamic>)sitesSection.GetCollection()).Single(i => (string)i["name"] == HostingEnvironment.SiteName); var firstHttpBinding = ((IEnumerable <dynamic>)site.GetCollection("bindings")).First(i => ((string)i["protocol"]).StartsWith("http")); var bindingInfo = ((string)firstHttpBinding["bindingInformation"]).Separate(":", false); var ipAddress = bindingInfo[0]; // Should never be empty; * means All Unassigned. var port = bindingInfo[1]; // never empty var host = bindingInfo[2]; return (NetTools.CombineUrls( "{0}://{1}:{2}".FormatWith((string)firstHttpBinding["protocol"], host.Any() ? host : ipAddress != "*" ? ipAddress : "localhost", port), HttpRuntime.AppDomainAppVirtualPath)); }
/// <summary> /// Sends an email from the default address to the developers with the given exception information and additional information about /// the running program. Prefix provides additional information before the standard exception and page information. /// The exception may be null. /// </summary> public static void EmailAndLogError(string prefix, Exception exception) { using (var sw = new StringWriter()) { if (prefix.Length > 0) { sw.WriteLine(prefix); sw.WriteLine(); } if (exception != null) { sw.WriteLine(exception.ToString()); sw.WriteLine(); } if (NetTools.IsWebApp()) { // This check ensures that there is an actual request, which is not the case during application initialization. if (EwfApp.Instance != null && EwfApp.Instance.RequestState != null) { sw.WriteLine("URL: " + AppRequestState.Instance.Url); sw.WriteLine(); foreach (string fieldName in HttpContext.Current.Request.Form) { sw.WriteLine("Form field " + fieldName + ": " + HttpContext.Current.Request.Form[fieldName]); } sw.WriteLine(); foreach (string cookieName in HttpContext.Current.Request.Cookies) { sw.WriteLine("Cookie " + cookieName + ": " + HttpContext.Current.Request.Cookies[cookieName].Value); } sw.WriteLine(); sw.WriteLine("User agent: " + HttpContext.Current.Request.GetUserAgent()); sw.WriteLine("Referrer: " + NetTools.ReferringUrl); User user = null; User impersonator = null; // exception-prone code try { user = User; impersonator = AppRequestState.Instance.ImpersonatorExists ? AppRequestState.Instance.ImpersonatorUser : null; } catch {} if (user != null) { sw.WriteLine("User: {0}{1}".FormatWith(user.Email, impersonator != null ? " (impersonated by {0})".FormatWith(impersonator.Email) : "")); } } } else { sw.WriteLine("Program: " + ConfigurationStatics.AppName); sw.WriteLine("Version: " + ConfigurationStatics.AppAssembly.GetName().Version); sw.WriteLine("Machine: " + StandardLibraryMethods.GetLocalHostName()); } StandardLibraryMethods.CallEveryMethod(delegate { sendErrorEmail(sw.ToString()); }, delegate { logError(sw.ToString()); }); } }