Commit Bug fixes from Helicon for Web Gallery and WebPI Installer

This commit is contained in:
Virtuworks 2012-08-14 14:52:56 -04:00
commit 5c70ddda8e
23 changed files with 182 additions and 74 deletions

View file

@ -19,3 +19,4 @@ WebsitePanel/Build
WebsitePanel.Installer/Build
WebsitePanel/Bin
msbuild.log
_ReSharper.*

View file

@ -864,12 +864,13 @@ namespace WebsitePanel.Setup
ServerManager serverManager = new ServerManager();
ApplicationPool pool = serverManager.ApplicationPools.Add(name);
if (!String.IsNullOrEmpty(username))
{
pool.ProcessModel.IdentityType = ProcessModelIdentityType.SpecificUser;
pool.ProcessModel.UserName = username;
pool.ProcessModel.Password = password;
}
if (!String.IsNullOrEmpty(username))
{
pool.ProcessModel.IdentityType = ProcessModelIdentityType.SpecificUser;
pool.ProcessModel.UserName = username;
pool.ProcessModel.Password = password;
pool.ProcessModel.LoadUserProfile = true;
}
else
{
pool.ProcessModel.IdentityType = ProcessModelIdentityType.NetworkService;
@ -961,6 +962,7 @@ namespace WebsitePanel.Setup
pool.ProcessModel.IdentityType = ProcessModelIdentityType.SpecificUser;
pool.ProcessModel.UserName = username;
pool.ProcessModel.Password = password;
pool.ProcessModel.LoadUserProfile = true;
}
else
{

View file

@ -78,12 +78,12 @@ namespace WebsitePanel.EnterpriseServer
if (Utils.ParseBool(serviceSettings["FeedEnableMicrosoft"], true))
{
arFeeds.Add("https://www.microsoft.com/web/webpi/3.0/WebProductList.xml");
arFeeds.Add(esServers.MAIN_WPI_FEED);
}
if (Utils.ParseBool(serviceSettings["FeedEnableHelicon"], true))
{
arFeeds.Add("http://www.helicontech.com/zoo/feed/wsp");
arFeeds.Add(esServers.HELICON_WPI_FEED);
}
string additionalFeeds = serviceSettings["FeedUrls"];

View file

@ -54,6 +54,9 @@ namespace WebsitePanel.EnterpriseServer
[ToolboxItem(false)]
public class esServers : System.Web.Services.WebService
{
public const string MAIN_WPI_FEED = "https://www.microsoft.com/web/webpi/4.0/WebProductList.xml";
public const string HELICON_WPI_FEED = "http://www.helicontech.com/zoo/feed/wsp4";
#region Servers
[WebMethod]
public List<ServerInfo> GetAllServers()
@ -677,12 +680,12 @@ namespace WebsitePanel.EnterpriseServer
if (Utils.ParseBool(wpiSettings["FeedEnableMicrosoft"] ,true))
{
arFeeds.Add( "https://www.microsoft.com/web/webpi/3.0/WebProductList.xml" );
arFeeds.Add( MAIN_WPI_FEED );
}
if (Utils.ParseBool(wpiSettings["FeedEnableHelicon"] ,true))
{
arFeeds.Add( "http://www.helicontech.com/zoo/feed/wsp" );
arFeeds.Add( HELICON_WPI_FEED );
}
string additionalFeeds = wpiSettings["FeedUrls"];

View file

@ -67,10 +67,7 @@
<Reference Include="Microsoft.Web.Management, Version=7.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">
<SpecificVersion>False</SpecificVersion>
<HintPath>..\..\Lib\References\Microsoft\Microsoft.Web.Management.dll</HintPath>
</Reference>
<Reference Include="Microsoft.Web.PlatformInstaller, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">
<SpecificVersion>False</SpecificVersion>
<HintPath>..\..\Lib\Microsoft.Web.PlatformInstaller.dll</HintPath>
<Private>True</Private>
</Reference>
<Reference Include="System" />
<Reference Include="System.Data" />

View file

@ -43,6 +43,7 @@ using WebsitePanel.Server.Utils;
using System.Web;
using System.Diagnostics;
using Microsoft.Practices.EnterpriseLibrary.Caching.Expirations;
using DeploymentParameter = WebsitePanel.Providers.WebAppGallery.DeploymentParameter;
namespace WebsitePanel.Providers.Web.WPIWebApplicationGallery
{
@ -56,13 +57,7 @@ namespace WebsitePanel.Providers.Web.WPIWebApplicationGallery
public WPIApplicationGallery(string sufix)
{
_sufix = sufix;
//_feeds = new[]
// {
// "https://www.microsoft.com/web/webpi/3.0/webproductlist.xml",
// "http://www.helicontech.com/zoo/feed/wsp"
// };
_cache = CacheFactory.GetCacheManager();
//_wpi = GetWpiHelper();
}
@ -79,8 +74,6 @@ namespace WebsitePanel.Providers.Web.WPIWebApplicationGallery
public void InitFeeds(int UserId, string[] feeds)
{
//Log.WriteInfo("InitFeeds {0} ", UserId);
string CACHE_KEY = GetKey_Feeds(UserId);
if (_cache.Contains(CACHE_KEY))
@ -194,9 +187,16 @@ namespace WebsitePanel.Providers.Web.WPIWebApplicationGallery
List<Product> products = wpi.GetApplications(categoryId);
List<GalleryApplication> applications = new List<GalleryApplication>();
foreach (Product product in products)
try
{
applications.Add(MakeGalleryApplicationFromProduct(product));
foreach (Product product in products)
{
applications.Add(MakeGalleryApplicationFromProduct(product));
}
}
catch(Exception ex)
{
//
}
return applications;
@ -381,7 +381,7 @@ namespace WebsitePanel.Providers.Web.WPIWebApplicationGallery
Id = product.ProductId,
Title = product.Title,
Author = new Author {Name = product.Author, Uri = product.AuthorUri.ToString()},
IconUrl = product.IconUrl.ToString(),
IconUrl = null == product.IconUrl ? "" : product.IconUrl.ToString(),
Version = product.Version,
Description = product.LongDescription,
Summary = product.Summary,
@ -399,6 +399,7 @@ namespace WebsitePanel.Providers.Web.WPIWebApplicationGallery
r.FriendlyName = d.FriendlyName;
r.DefaultValue = d.DefaultValue;
r.Description = d.Description;
#pragma warning disable 612,618
r.WellKnownTags = (DeploymentParameterWellKnownTag) d.Tags;
if (null != d.Validation)
{
@ -409,6 +410,7 @@ namespace WebsitePanel.Providers.Web.WPIWebApplicationGallery
{
r.ValidationKind = DeploymentParameterValidationKind.None;
}
#pragma warning restore 612,618
return r;
}

View file

@ -71,7 +71,8 @@ namespace WebsitePanel.Providers.Web
public const string WAG_XML_FEED_CACHE_KEY = "WAG_XML_FEED_CACHE_KEY";
public const int WEB_APPLICATIONS_CACHE_STORE_MINUTES = 60;
public const int XML_FEED_RECOVERY_ATTEMPTS = 10;
public const string WAG_DEFAULT_FEED_URL = "https://www.microsoft.com/web/webpi/3.0/WebApplicationList.xml";
// public const string WAG_DEFAULT_FEED_URL = "https://www.microsoft.com/web/webpi/3.0/WebApplicationList.xml";
public const string WAG_DEFAULT_FEED_URL = "https://www.microsoft.com/web/webpi/4.0/webapplicationlist.xml";
// well-known parameters matching
public readonly Dictionary<string, DeploymentParameterWellKnownTag> wellKnownParameters

View file

@ -70,10 +70,17 @@
<Reference Include="Microsoft.Web.Deployment, Version=9.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">
<SpecificVersion>False</SpecificVersion>
<HintPath>..\..\Lib\References\Microsoft\Microsoft.Web.Deployment.dll</HintPath>
<Private>True</Private>
</Reference>
<Reference Include="Microsoft.Web.PlatformInstaller, Version=3.0.3.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">
<Reference Include="Microsoft.Web.PlatformInstaller, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">
<SpecificVersion>False</SpecificVersion>
<HintPath>..\..\Lib\Microsoft.Web.PlatformInstaller.dll</HintPath>
<HintPath>..\..\Lib\References\Microsoft\Microsoft.Web.PlatformInstaller.dll</HintPath>
<Private>True</Private>
</Reference>
<Reference Include="Microsoft.Web.PlatformInstaller.WebDeployShim, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">
<SpecificVersion>False</SpecificVersion>
<HintPath>..\..\Lib\References\Microsoft\Microsoft.Web.PlatformInstaller.WebDeployShim.dll</HintPath>
<Private>True</Private>
</Reference>
<Reference Include="System" />
<Reference Include="System.Data" />

View file

@ -29,6 +29,7 @@
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Text;
using System.Threading;
using Microsoft.Web.PlatformInstaller;
@ -188,9 +189,11 @@ namespace WebsitePanel.Server.WPIService
{
_installationStatus = EWPIServiceStatus.InstallationComplete;
}
CheckIISAlive();
}
private void InstallStatusUpdatedHandler(object sender, InstallStatusEventArgs e)
{
StringBuilder sb = new StringBuilder();
@ -242,6 +245,27 @@ namespace WebsitePanel.Server.WPIService
_statusMessage = sb.ToString();
}
}
private void CheckIISAlive()
{
// run iisreset /start
ProcessStartInfo processStartInfo = new ProcessStartInfo(@"C:\Windows\System32\iisreset.exe", "/start");
processStartInfo.UseShellExecute = false;
try
{
using (Process exeProcess = Process.Start(processStartInfo))
{
exeProcess.WaitForExit();
Debug.Write("WPIService: iisreset /start returns "+exeProcess.ExitCode);
}
}
catch (Exception ex)
{
Debug.Write("WPIService: iisreset /start exception: "+ex.ToString());
}
}
#endregion
}
}

View file

@ -10,7 +10,7 @@
<AppDesignerFolder>Properties</AppDesignerFolder>
<RootNamespace>WebsitePanel.Server.WPIService</RootNamespace>
<AssemblyName>WebsitePanel.Server.WPIService</AssemblyName>
<TargetFrameworkVersion>v3.5</TargetFrameworkVersion>
<TargetFrameworkVersion>v4.0</TargetFrameworkVersion>
<TargetFrameworkProfile>
</TargetFrameworkProfile>
<FileAlignment>512</FileAlignment>
@ -36,10 +36,17 @@
<Reference Include="Microsoft.Web.Deployment, Version=9.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">
<SpecificVersion>False</SpecificVersion>
<HintPath>..\..\Lib\References\Microsoft\Microsoft.Web.Deployment.dll</HintPath>
<Private>True</Private>
</Reference>
<Reference Include="Microsoft.Web.PlatformInstaller, Version=3.0.3.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">
<Reference Include="Microsoft.Web.PlatformInstaller, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">
<SpecificVersion>False</SpecificVersion>
<HintPath>..\..\Lib\Microsoft.Web.PlatformInstaller.dll</HintPath>
<HintPath>..\..\Lib\References\Microsoft\Microsoft.Web.PlatformInstaller.dll</HintPath>
<Private>True</Private>
</Reference>
<Reference Include="Microsoft.Web.PlatformInstaller.WebDeployShim, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">
<SpecificVersion>False</SpecificVersion>
<HintPath>..\..\Lib\References\Microsoft\Microsoft.Web.PlatformInstaller.WebDeployShim.dll</HintPath>
<Private>True</Private>
</Reference>
<Reference Include="System" />
<Reference Include="System.Runtime.Remoting" />
@ -61,6 +68,9 @@
<Name>WebsitePanel.Server.WPIServiceContract</Name>
</ProjectReference>
</ItemGroup>
<ItemGroup>
<None Include="app.config" />
</ItemGroup>
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
<PropertyGroup>
<PostBuildEvent>

View file

@ -0,0 +1,11 @@
<?xml version="1.0"?>
<configuration>
<startup><supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0"/></startup> <runtime>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly>
<assemblyIdentity name="Microsoft.Web.Deployment" publicKeyToken="31BF3856AD364E35" culture="neutral"/>
<bindingRedirect oldVersion="0.0.0.0-9.0.0.0" newVersion="9.0.0.0"/>
</dependentAssembly>
</assemblyBinding>
</runtime>
</configuration>

View file

@ -60,7 +60,8 @@ namespace WebsitePanel.Server.Code
private readonly List<string> _feeds;
private string _webPIinstallersFolder;
private const string MainWpiFeed = "https://www.microsoft.com/web/webpi/3.0/webproductlist.xml";
//private const string MainWpiFeed = "https://www.microsoft.com/web/webpi/3.0/webproductlist.xml";
private const string MainWpiFeed = "https://www.microsoft.com/web/webpi/4.0/WebProductList.xml";
private const string IisChoiceProduct = "StaticContent";
private const string WebMatrixChoiceProduct = "WebMatrix";
private ProductManager _productManager;
@ -682,9 +683,11 @@ namespace WebsitePanel.Server.Code
private static bool IsAlienDbTaggedParameter(DeploymentWellKnownTag dbTag, DeclaredParameter parameter)
{
#pragma warning disable 612,618
return (parameter.Tags & databaseEngineTags) != DeploymentWellKnownTag.None
&&
(parameter.Tags & dbTag) == DeploymentWellKnownTag.None;
#pragma warning restore 612,618
}
private static void RemoveUnusedProviders(MSDeployPackage msDeployPackage, DeploymentWellKnownTag dbTag)

View file

@ -45,10 +45,17 @@
<Reference Include="Microsoft.Web.Deployment, Version=9.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">
<SpecificVersion>False</SpecificVersion>
<HintPath>..\..\Lib\References\Microsoft\Microsoft.Web.Deployment.dll</HintPath>
<Private>True</Private>
</Reference>
<Reference Include="Microsoft.Web.PlatformInstaller, Version=3.0.3.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">
<Reference Include="Microsoft.Web.PlatformInstaller, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">
<SpecificVersion>False</SpecificVersion>
<HintPath>..\..\Lib\Microsoft.Web.PlatformInstaller.dll</HintPath>
<HintPath>..\..\Lib\References\Microsoft\Microsoft.Web.PlatformInstaller.dll</HintPath>
<Private>True</Private>
</Reference>
<Reference Include="Microsoft.Web.PlatformInstaller.WebDeployShim, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">
<SpecificVersion>False</SpecificVersion>
<HintPath>..\..\Lib\References\Microsoft\Microsoft.Web.PlatformInstaller.WebDeployShim.dll</HintPath>
<Private>True</Private>
</Reference>
<Reference Include="Microsoft.Web.Services3, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">
<SpecificVersion>False</SpecificVersion>

View file

@ -31,6 +31,7 @@ using System.IO;
using System.Data;
using System.Security;
using System.Text;
using System.Text.RegularExpressions;
using System.Threading;
using System.Web;
using System.Diagnostics;
@ -39,7 +40,6 @@ using System.Collections.Generic;
using System.Web.Services;
using System.Web.Services.Protocols;
using System.ComponentModel;
using System.Text.RegularExpressions;
using System.ServiceProcess;
using System.ServiceModel;
using System.Runtime.Remoting;
@ -56,6 +56,11 @@ using WebsitePanel.Providers;
using WebsitePanel.Server.WPIService;
namespace WebsitePanel.Server
{
/// <summary>
@ -615,31 +620,35 @@ namespace WebsitePanel.Server
}
}
private void StartWpiService()
{
string binFolder = HttpContext.Current.Server.MapPath("/bin/");
string workingDirectory = Path.Combine(Environment.ExpandEnvironmentVariables("%SystemRoot%"), "Temp\\zoo.wpi");
string newUserProfile = Path.Combine(Environment.ExpandEnvironmentVariables("%SystemRoot%"), "Temp\\zoo.wpi");
string newAppData = Path.Combine(newUserProfile, "Roaming");
string newLocalAppData = Path.Combine(newUserProfile, "Local");
try
{
Directory.CreateDirectory(newUserProfile);
Directory.CreateDirectory(newAppData);
Directory.CreateDirectory(newLocalAppData);
}
catch (Exception)
{
//throw;
}
//string newUserProfile = Path.Combine(Environment.ExpandEnvironmentVariables("%SystemRoot%"), "Temp\\zoo.wpi");
//string newAppData = Path.Combine(newUserProfile, "Roaming");
//string newLocalAppData = Path.Combine(newUserProfile, "Local");
//try
//{
// Directory.CreateDirectory(newUserProfile);
// Directory.CreateDirectory(newAppData);
// Directory.CreateDirectory(newLocalAppData);
//}
//catch (Exception)
//{
// //throw;
//}
Process wpiServiceExe = new Process();
wpiServiceExe.StartInfo = new ProcessStartInfo(Path.Combine(binFolder, "WebsitePanel.Server.WPIService.exe"));
wpiServiceExe.StartInfo.WorkingDirectory = workingDirectory;
wpiServiceExe.StartInfo.UseShellExecute = false;
wpiServiceExe.StartInfo.EnvironmentVariables["UserProfile"] = newUserProfile;
wpiServiceExe.StartInfo.EnvironmentVariables["LocalAppData"] = newLocalAppData;
wpiServiceExe.StartInfo.EnvironmentVariables["AppData"] = newAppData;
wpiServiceExe.StartInfo.LoadUserProfile = true;
//wpiServiceExe.StartInfo.EnvironmentVariables["UserProfile"] = newUserProfile;
//wpiServiceExe.StartInfo.EnvironmentVariables["LocalAppData"] = newLocalAppData;
//wpiServiceExe.StartInfo.EnvironmentVariables["AppData"] = newAppData;
if (wpiServiceExe.Start())
{
_WpiServiceExe = wpiServiceExe;
@ -740,12 +749,13 @@ namespace WebsitePanel.Server
Log.WriteError("WpiGetLogFileDirectory", ex);
throw;
//throw;
return string.Empty;
}
}
[WebMethod]
public SettingPair[] WpiGetLogsInDirectory(string Path)
public SettingPair[] WpiGetLogsInDirectory(string path)
{
try
{
@ -753,7 +763,7 @@ namespace WebsitePanel.Server
ArrayList result = new ArrayList();
string[] filePaths = Directory.GetFiles(Path);
string[] filePaths = Directory.GetFiles(path);
foreach (string filePath in filePaths)
{
using (StreamReader streamReader = new StreamReader(filePath))
@ -773,7 +783,8 @@ namespace WebsitePanel.Server
Log.WriteError("WpiGetLogFileDirectory", ex);
throw;
//throw;
return null;
}
}
@ -981,4 +992,6 @@ namespace WebsitePanel.Server
}
#endregion
}
}

View file

@ -187,7 +187,7 @@
<value>Applications Installer</value>
</data>
<data name="ModuleTitle.WebApplicationsGallery" xml:space="preserve">
<value>Microsoft Web Application Gallery</value>
<value>Web Application Gallery</value>
</data>
<data name="ModuleTitle.AuditLog" xml:space="preserve">
<value>Audit Log</value>

View file

@ -445,7 +445,7 @@
<value>{user} - {space} - Web Site IP Addresses</value>
</data>
<data name="PageTitle.SpaceWebApplicationsGallery" xml:space="preserve">
<value>{user} - {space} - Microsoft Web Application Gallery</value>
<value>{user} - {space} - Web Application Gallery</value>
</data>
<data name="PageName.SpaceWeb" xml:space="preserve">
<value>Web</value>

View file

@ -327,7 +327,10 @@ namespace WebsitePanel.Portal
if (string.IsNullOrEmpty(wpiLogsDir))
{
wpiLogsDir = ES.Services.Servers.WpiGetLogFileDirectory(PanelRequest.ServerId);
ViewState[_wpiLogsDirViewStateKey] = wpiLogsDir;
if (!string.IsNullOrEmpty(wpiLogsDir))
{
ViewState[_wpiLogsDirViewStateKey] = wpiLogsDir;
}
}
}
catch
@ -532,37 +535,51 @@ namespace WebsitePanel.Portal
protected void ShowLogsButton_OnClick(object sender, EventArgs e)
{
//show logs
string wpiLogsDir = null;
object[] logsEntrys = null;
try
{
string wpiLogsDir = ViewState[_wpiLogsDirViewStateKey] as string;
wpiLogsDir = ViewState[_wpiLogsDirViewStateKey] as string;
if (!string.IsNullOrEmpty(wpiLogsDir))
{
//Get logs !!!
object[] logsEntrys = ES.Services.Servers.WpiGetLogsInDirectory(PanelRequest.ServerId, wpiLogsDir);
logsEntrys = ES.Services.Servers.WpiGetLogsInDirectory(PanelRequest.ServerId, wpiLogsDir);
WpiLogsPanel.Visible = true;
StringBuilder sb = new StringBuilder();
foreach (SettingPair entry in logsEntrys)
if (null == logsEntrys)
{
string fileName = (string)entry.Name;
string fileContent = (string)entry.Value;
sb.AppendLine().AppendFormat("<h3>{0}</h3>", fileName).AppendLine().Append(fileContent).AppendLine();
WpiLogsPanel.Visible = true;
string msg = string.Format("Could not get logs files. Log files folder:\n{0}", wpiLogsDir);
WpiLogsPre.InnerText = msg;
}
else
{
WpiLogsPanel.Visible = true;
WpiLogsPre.InnerHtml = sb.ToString();
StringBuilder sb = new StringBuilder();
ShowLogsButton.Visible = false;
ProgressTimer.Enabled = false;
foreach (SettingPair entry in logsEntrys)
{
string fileName = (string) entry.Name;
string fileContent = (string) entry.Value;
sb.AppendLine().AppendFormat("<h3>{0}</h3>", fileName).AppendLine().Append(fileContent).
AppendLine();
}
WpiLogsPre.InnerHtml = sb.ToString();
ShowLogsButton.Visible = false;
ProgressTimer.Enabled = false;
}
}
}
catch (Exception ex)
{
WpiLogsPanel.Visible = true;
WpiLogsPre.InnerText = ex.ToString();
string msg = string.Format("wpiLogsDir: {0}\nlogsEntrys is null: {1}\n{2}", wpiLogsDir, logsEntrys == null, ex);
WpiLogsPre.InnerText = msg;
}
}
}

View file

@ -123,7 +123,7 @@ ul.WPIKeywordList>li {
<asp:hyperlink NavigateUrl='<%# EditUrl("ApplicationID", Eval("Id").ToString(), "edit", "SpaceID=" + PanelSecurity.PackageId.ToString()) %>'
runat="server" ID="Hyperlink3" ToolTip='<%# Eval("Title") %>'>
<asp:Image runat="server" ID="Image1" Width="120" Height="120"
ImageUrl='<%# "~/DesktopModules/WebsitePanel/ResizeImage.ashx?width=120&height=120&url=" + Server.UrlEncode((string)Eval("IconUrl")) %>'
ImageUrl='<%# GetIconUrlOrDefault((string)Eval("IconUrl")) %>'
AlternateText='<%# Eval("Title") %>'>
</asp:Image>
</asp:hyperlink>

View file

@ -178,5 +178,15 @@ namespace WebsitePanel.Portal
}
ES.Services.WebApplicationGallery.SetResourceLanguage(PanelSecurity.PackageId, lang);
}
protected string GetIconUrlOrDefault(string url)
{
if (string.IsNullOrEmpty(url))
{
return "/App_Themes/Default/icons/sphere_128.png";
}
return "~/DesktopModules/WebsitePanel/ResizeImage.ashx?width=120&height=120&url=" + Server.UrlEncode(url);
}
}
}