#111: System.InvalidCastException is thrown when accessing a VPS via Remote Desktop Connection feature
This commit is contained in:
parent
6ff01b5adf
commit
d7adf24187
3 changed files with 53 additions and 16 deletions
|
@ -2700,7 +2700,7 @@ namespace WebsitePanel.EnterpriseServer
|
||||||
public static NetworkAdapterDetails GetExternalNetworkAdapterDetails(int itemId)
|
public static NetworkAdapterDetails GetExternalNetworkAdapterDetails(int itemId)
|
||||||
{
|
{
|
||||||
// load service item
|
// load service item
|
||||||
VirtualMachine vm = (VirtualMachine)PackageController.GetPackageItem(itemId);
|
VMInfo vm = (VMInfo)PackageController.GetPackageItem(itemId);
|
||||||
if (vm == null)
|
if (vm == null)
|
||||||
return null;
|
return null;
|
||||||
|
|
||||||
|
|
|
@ -29,9 +29,54 @@
|
||||||
using WebsitePanel.EnterpriseServer;
|
using WebsitePanel.EnterpriseServer;
|
||||||
using WebsitePanel.Providers.Virtualization;
|
using WebsitePanel.Providers.Virtualization;
|
||||||
using System.Web;
|
using System.Web;
|
||||||
|
using System;
|
||||||
|
|
||||||
namespace WebsitePanel.Portal
|
namespace WebsitePanel.Portal
|
||||||
{
|
{
|
||||||
|
// TODO: Move this extension to a separate file later.
|
||||||
|
public static class VirtualMachinesExtensions
|
||||||
|
{
|
||||||
|
#region Privates with specific purposes (eq. caching, usability, performance and etc)
|
||||||
|
/// <summary>
|
||||||
|
/// This method supports the Portal internal infrastructure and is not intended to be used directly from your code. Gets a cached copy of virtual machine object of the specified type or retrieves it for the first time and then caches it.
|
||||||
|
/// </summary>
|
||||||
|
/// <typeparam name="T">Type of virtual machine to be retrieved (possible types are VirtualMachine|VMInfo)</typeparam>
|
||||||
|
/// <param name="cacheIdentityKey">Virtual machine item id</param>
|
||||||
|
/// <param name="getVmFunc">Function to retrieve the virtual machine data from Enterprise Server</param>
|
||||||
|
/// <returns>An instance of the specified virtual machine</returns>
|
||||||
|
internal static T GetCachedVirtualMachine<T>(object cacheIdentityKey, Func<T> getVmFunc)
|
||||||
|
{
|
||||||
|
// TODO: Make this method private when all dependents will be consolidated in the extension.
|
||||||
|
string cacheKey = "CachedVirtualMachine_" + cacheIdentityKey;
|
||||||
|
if (HttpContext.Current.Items[cacheKey] != null)
|
||||||
|
return (T)HttpContext.Current.Items[cacheKey];
|
||||||
|
|
||||||
|
// load virtual machine
|
||||||
|
T virtualMachine = getVmFunc();
|
||||||
|
|
||||||
|
// place to cache
|
||||||
|
if (virtualMachine != null)
|
||||||
|
HttpContext.Current.Items[cacheKey] = virtualMachine;
|
||||||
|
|
||||||
|
return virtualMachine;
|
||||||
|
}
|
||||||
|
#endregion
|
||||||
|
|
||||||
|
#region Extension methods
|
||||||
|
/// <summary>
|
||||||
|
/// Gets a cached copy of virtual machine object of the specified type or retrieves it for the first time and then caches it.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="client"></param>
|
||||||
|
/// <param name="itemId">Virtual machine id</param>
|
||||||
|
/// <returns>An instance of the virtual machine speficied</returns>
|
||||||
|
public static VMInfo GetCachedVirtualMachine(this esVirtualizationServerForPrivateCloud client, int itemId)
|
||||||
|
{
|
||||||
|
return GetCachedVirtualMachine<VMInfo>(
|
||||||
|
itemId, () => ES.Services.VPSPC.GetVirtualMachineItem(itemId));
|
||||||
|
}
|
||||||
|
#endregion
|
||||||
|
}
|
||||||
|
|
||||||
public class VirtualMachinesHelper
|
public class VirtualMachinesHelper
|
||||||
{
|
{
|
||||||
public static bool IsVirtualMachineManagementAllowed(int packageId)
|
public static bool IsVirtualMachineManagementAllowed(int packageId)
|
||||||
|
@ -57,20 +102,11 @@ namespace WebsitePanel.Portal
|
||||||
return manageAllowed;
|
return manageAllowed;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// TODO: Move this method to the corresponding extension later.
|
||||||
public static VirtualMachine GetCachedVirtualMachine(int itemId)
|
public static VirtualMachine GetCachedVirtualMachine(int itemId)
|
||||||
{
|
{
|
||||||
string key = "CachedVirtualMachine" + itemId;
|
return VirtualMachinesExtensions.GetCachedVirtualMachine<VirtualMachine>(
|
||||||
if (HttpContext.Current.Items[key] != null)
|
itemId, () => ES.Services.VPS.GetVirtualMachineItem(itemId));
|
||||||
return (VirtualMachine)HttpContext.Current.Items[key];
|
|
||||||
|
|
||||||
// load virtual machine
|
|
||||||
VirtualMachine vm = ES.Services.VPS.GetVirtualMachineItem(itemId);
|
|
||||||
|
|
||||||
// place to cache
|
|
||||||
if (vm != null)
|
|
||||||
HttpContext.Current.Items[key] = vm;
|
|
||||||
|
|
||||||
return vm;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#region Virtual Machines
|
#region Virtual Machines
|
||||||
|
|
|
@ -40,13 +40,14 @@ namespace WebsitePanel.Portal.VPSForPC.RemoteDesktop
|
||||||
resolution.Text = Request["Resolution"];
|
resolution.Text = Request["Resolution"];
|
||||||
|
|
||||||
// load server info
|
// load server info
|
||||||
VirtualMachine vm = VirtualMachinesHelper.GetCachedVirtualMachine(PanelRequest.ItemID);
|
VMInfo vm = ES.Services.VPSPC.GetCachedVirtualMachine(PanelRequest.ItemID);
|
||||||
litServerName.Text = vm.Name + " - ";
|
litServerName.Text = vm.Name + " - ";
|
||||||
username.Text = "Administrator";
|
username.Text = "Administrator";
|
||||||
password.Text = vm.AdministratorPassword;
|
// TODO: Review VMInfo class fields and underlying data for correctness
|
||||||
|
password.Text = vm.AdminPassword;
|
||||||
|
|
||||||
// load external network parameters
|
// load external network parameters
|
||||||
NetworkAdapterDetails nic = ES.Services.VPS.GetExternalNetworkAdapterDetails(PanelRequest.ItemID);
|
NetworkAdapterDetails nic = ES.Services.VPSPC.GetExternalNetworkAdapterDetails(PanelRequest.ItemID);
|
||||||
if (nic.IPAddresses.Length > 0)
|
if (nic.IPAddresses.Length > 0)
|
||||||
{
|
{
|
||||||
NetworkAdapterIPAddress ip = nic.IPAddresses[0];
|
NetworkAdapterIPAddress ip = nic.IPAddresses[0];
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue