diff --git a/src/AddIns/BackendBindings/AspNet.Mvc/Project/AspNet.Mvc.csproj b/src/AddIns/BackendBindings/AspNet.Mvc/Project/AspNet.Mvc.csproj index 923e3db267..5fdddc6f26 100644 --- a/src/AddIns/BackendBindings/AspNet.Mvc/Project/AspNet.Mvc.csproj +++ b/src/AddIns/BackendBindings/AspNet.Mvc/Project/AspNet.Mvc.csproj @@ -160,6 +160,11 @@ + + + + + @@ -219,6 +224,7 @@ + diff --git a/src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/IIS6Administrator.cs b/src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/IIS6Administrator.cs new file mode 100644 index 0000000000..0a470b9f05 --- /dev/null +++ b/src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/IIS6Administrator.cs @@ -0,0 +1,36 @@ +// Copyright (c) AlphaSierraPapa for the SharpDevelop Team (for details please see \doc\copyright.txt) +// This code is distributed under the GNU LGPL (for details please see \doc\license.txt) + +using System; +using System.EnterpriseServices.Internal; + +namespace ICSharpCode.AspNet.Mvc +{ + public class IIS6Administrator : IISAdministrator + { + const string IIS_WEB_LOCATION = "IIS://localhost/W3SVC/1/Root"; + + public IIS6Administrator(WebProjectProperties properties) + : base(properties) + { + } + + public override bool IsIISInstalled() + { + return WebProjectService.IsIISInstalled; + } + + public override void CreateVirtualDirectory(WebProject project) + { + string error = null; + var virtualRoot = new IISVirtualRoot(); + virtualRoot.Create(IIS_WEB_LOCATION, + project.Directory, + project.Name, + out error); + if (!String.IsNullOrEmpty(error)) { + throw new ApplicationException(error); + } + } + } +} diff --git a/src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/IIS7Administrator.cs b/src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/IIS7Administrator.cs new file mode 100644 index 0000000000..6ac303213f --- /dev/null +++ b/src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/IIS7Administrator.cs @@ -0,0 +1,44 @@ +// Copyright (c) AlphaSierraPapa for the SharpDevelop Team (for details please see \doc\copyright.txt) +// This code is distributed under the GNU LGPL (for details please see \doc\license.txt) + +using System; + +namespace ICSharpCode.AspNet.Mvc +{ + public class IIS7Administrator : IISAdministrator + { + public IIS7Administrator(WebProjectProperties properties) + : base(properties) + { + } + + public override bool IsIISInstalled() + { + return WebProjectService.IsIISInstalled; + } + + public override void CreateVirtualDirectory(WebProject project) + { + string name = "/" + project.Name; + + dynamic manager = CreateServerManager(); + + if (manager.Sites[DEFAULT_WEB_SITE] != null) { + if (manager.Sites[DEFAULT_WEB_SITE].Applications[name] == null) { + manager.Sites[DEFAULT_WEB_SITE].Applications.Add(name, project.Directory); + manager.CommitChanges(); + } else { + ThrowApplicationExistsException(); + } + } else { + if (manager.Sites[0].Applications[name] == null) { + manager.Sites[0].Applications.Add(name, project.Directory); + manager.CommitChanges(); + } else { + ThrowApplicationExistsException(); + } + } + manager.Dispose(); + } + } +} diff --git a/src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/IISAdministrator.cs b/src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/IISAdministrator.cs new file mode 100644 index 0000000000..a710737522 --- /dev/null +++ b/src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/IISAdministrator.cs @@ -0,0 +1,75 @@ +// Copyright (c) AlphaSierraPapa for the SharpDevelop Team (for details please see \doc\copyright.txt) +// This code is distributed under the GNU LGPL (for details please see \doc\license.txt) + +using System; +using System.Reflection; +using ICSharpCode.Core; +using ICSharpCode.SharpDevelop.Dom; + +namespace ICSharpCode.AspNet.Mvc +{ + public abstract class IISAdministrator + { + public const string DEFAULT_WEB_SITE = "Default Web Site"; + + protected IISAdministrator(WebProjectProperties properties) + { + this.Properties = properties; + } + + protected IISAdministrator() + { + } + + protected WebProjectProperties Properties { get; set; } + + public static IISAdministrator CreateAdministrator(WebProjectProperties properties) + { + if (properties.UseIISExpress) { + return new IISExpressAdministrator(properties); + } + switch (WebProjectService.IISVersion) { + case IISVersion.IIS5: + case IISVersion.IIS6: + return new IIS6Administrator(properties); + case IISVersion.None: + return new NullIISAdministrator(); + default: + return new IIS7Administrator(properties); + } + } + + public abstract bool IsIISInstalled(); + + public abstract void CreateVirtualDirectory(WebProject project); + + protected dynamic CreateServerManager() + { + Assembly webAdministrationAssembly = GetWebAdminstrationAssembly(); + return webAdministrationAssembly.CreateInstance("Microsoft.Web.Administration.ServerManager"); + } + + protected Assembly GetWebAdminstrationAssembly() + { + foreach(DomAssemblyName assembly in GacInterop.GetAssemblyList()) { + if (assembly.FullName.Contains("Microsoft.Web.Administration")) { + if (IsServerManagementVersionRequired(assembly)) { + return Assembly.Load(assembly.FullName); + } + } + } + throw new ApplicationException(ResourceService.GetString("ICSharpCode.WebProjectOptionsPanel.IISNotFound")); + } + + + protected virtual bool IsServerManagementVersionRequired(DomAssemblyName assemblyName) + { + return true; + } + + protected void ThrowApplicationExistsException() + { + throw new ApplicationException(ResourceService.GetString("ICSharpCode.WebProjectOptionsPanel.ApplicationExists")); + } + } +} diff --git a/src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/IISExpressAdministrator.cs b/src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/IISExpressAdministrator.cs new file mode 100644 index 0000000000..f7a280e3ea --- /dev/null +++ b/src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/IISExpressAdministrator.cs @@ -0,0 +1,36 @@ +// Copyright (c) AlphaSierraPapa for the SharpDevelop Team (for details please see \doc\copyright.txt) +// This code is distributed under the GNU LGPL (for details please see \doc\license.txt) + +using System; +using ICSharpCode.SharpDevelop.Dom; + +namespace ICSharpCode.AspNet.Mvc +{ + public class IISExpressAdministrator : IISAdministrator + { + public IISExpressAdministrator(WebProjectProperties properties) + : base(properties) + { + } + + public override bool IsIISInstalled() + { + return WebProjectService.IsIISExpressInstalled; + } + + public override void CreateVirtualDirectory(WebProject project) + { + dynamic manager = CreateServerManager(); + dynamic site = manager.Sites.Add(project.Name, project.Directory, Properties.DevelopmentServerPort); + string bindingInformation = String.Format("*:{0}:localhost", Properties.DevelopmentServerPort); + site.Bindings[0].BindingInformation = bindingInformation; + manager.CommitChanges(); + manager.Dispose(); + } + + protected override bool IsServerManagementVersionRequired(DomAssemblyName assemblyName) + { + return (assemblyName.Version.Major == 7) && (assemblyName.Version.Minor == 9); + } + } +} diff --git a/src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/IISExpressProcessStartInfo.cs b/src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/IISExpressProcessStartInfo.cs new file mode 100644 index 0000000000..fcadb807c7 --- /dev/null +++ b/src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/IISExpressProcessStartInfo.cs @@ -0,0 +1,21 @@ +// Copyright (c) AlphaSierraPapa for the SharpDevelop Team (for details please see \doc\copyright.txt) +// This code is distributed under the GNU LGPL (for details please see \doc\license.txt) + +using System; +using System.Diagnostics; + +namespace ICSharpCode.AspNet.Mvc +{ + public static class IISExpressProcessStartInfo + { + public static ProcessStartInfo Create(WebProject project) + { + return new ProcessStartInfo(WebProjectService.IISExpressProcessLocation, GetSiteArgument(project)); + } + + static string GetSiteArgument(WebProject project) + { + return String.Format("/site:{0}", project.Name); + } + } +} diff --git a/src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/NullIISAdministrator.cs b/src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/NullIISAdministrator.cs new file mode 100644 index 0000000000..227c3d951f --- /dev/null +++ b/src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/NullIISAdministrator.cs @@ -0,0 +1,23 @@ +// Copyright (c) AlphaSierraPapa for the SharpDevelop Team (for details please see \doc\copyright.txt) +// This code is distributed under the GNU LGPL (for details please see \doc\license.txt) + +using System; + +namespace ICSharpCode.AspNet.Mvc +{ + public class NullIISAdministrator : IISAdministrator + { + public NullIISAdministrator() + { + } + + public override bool IsIISInstalled() + { + return false; + } + + public override void CreateVirtualDirectory(WebProject project) + { + } + } +} diff --git a/src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/WebBehavior.cs b/src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/WebBehavior.cs index bd07723636..fbafe42076 100644 --- a/src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/WebBehavior.cs +++ b/src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/WebBehavior.cs @@ -85,7 +85,8 @@ namespace ICSharpCode.AspNet.Mvc if (properties.UseIISExpress) { // start IIS express and attach to it if (WebProjectService.IsIISExpressInstalled) { - DebuggerService.CurrentDebugger.Start(new ProcessStartInfo(WebProjectService.IISExpressProcessLocation)); + ProcessStartInfo processInfo = IISExpressProcessStartInfo.Create(WebProject); + DebuggerService.CurrentDebugger.Start(processInfo); } else { DisposeProcessMonitor(); MessageService.ShowError("${res:ICSharpCode.WepProjectOptionsPanel.NoProjectUrlOrProgramAction}"); diff --git a/src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/WebProject.cs b/src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/WebProject.cs index 915cfb2edd..0f733d4a7c 100644 --- a/src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/WebProject.cs +++ b/src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/WebProject.cs @@ -21,6 +21,14 @@ namespace ICSharpCode.AspNet.Mvc this.msbuildProject = msbuildProject; } + public string Name { + get { return msbuildProject.Name; } + } + + public string Directory { + get { return msbuildProject.Directory; } + } + public bool HasWebProjectProperties() { if (VisualStudioProjectExtension.ProjectContainsExtension(msbuildProject)) { diff --git a/src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/WebProjectOptions/WebProjectOptionsPanel.xaml.cs b/src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/WebProjectOptions/WebProjectOptionsPanel.xaml.cs index f5adc8ddbe..74aca4a832 100644 --- a/src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/WebProjectOptions/WebProjectOptionsPanel.xaml.cs +++ b/src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/WebProjectOptions/WebProjectOptionsPanel.xaml.cs @@ -36,6 +36,7 @@ namespace ICSharpCode.AspNet.Mvc if (WebProjectService.IsIISExpressInstalled) { UseIISExpress.IsChecked = true; PortTextBox.Text = properties.DevelopmentServerPort.ToString(); + ProjectUrl.Text = String.Empty; SelectIISExpress(); } } else if (properties.UseIIS) { @@ -57,7 +58,6 @@ namespace ICSharpCode.AspNet.Mvc { if (IsDirty) { webProject.UpdateWebProjectProperties(properties); - //project.Save(); } IsDirty = false; return true; @@ -65,28 +65,29 @@ namespace ICSharpCode.AspNet.Mvc void CreateVirtualDirectory_Click(object sender, RoutedEventArgs e) { - string error = WebProjectService.CreateVirtualDirectory( - GetWebServer(), - ProjectService.CurrentProject.Name, - Path.GetDirectoryName(ProjectService.CurrentProject.FileName)); - - if (!string.IsNullOrEmpty(error)) { - MessageService.ShowError(error); - } else { + try { + IISAdministrator administrator = IISAdministrator.CreateAdministrator(properties); + if (!administrator.IsIISInstalled()) { + ShowIISNotFoundMessage(); + return; + } + + administrator.CreateVirtualDirectory(webProject); MessageService.ShowMessage(ResourceService.GetString("ICSharpCode.WebProjectOptionsPanel.VirtualDirCreated")); + } catch (Exception ex) { + MessageService.ShowError(ex.Message); } } - WebServer GetWebServer() + void ShowIISNotFoundMessage() { - if (properties.UseIISExpress) { - return WebServer.IISExpress; - } - return WebServer.IIS; + MessageService.ShowWarning(ResourceService.GetString("ICSharpCode.WebProjectOptionsPanel.IISNotFound")); } void UseIISExpress_Click(object sender, RoutedEventArgs e) { + ProjectUrl.Text = String.Empty; + properties.IISUrl = String.Format(@"http://localhost:{0}/", PortTextBox.Text); SelectIISExpress(); OnWebProjectPropertiesChanged(); } @@ -96,10 +97,6 @@ namespace ICSharpCode.AspNet.Mvc properties.UseIISExpress = true; properties.UseIIS = false; properties.DevelopmentServerPort = Int32.Parse(PortTextBox.Text); - if (String.IsNullOrEmpty(properties.IISUrl)) { - properties.IISUrl = String.Format(@"http://localhost:{0}/" + ProjectService.CurrentProject.Name, PortTextBox.Text); - OnWebProjectPropertiesChanged(); - } bool isIISExpressInstalled = WebProjectService.IsIISExpressInstalled; if (!isIISExpressInstalled) { @@ -109,13 +106,13 @@ namespace ICSharpCode.AspNet.Mvc } else { StatusLabel.Text = String.Empty; } - IISExpressGroup.IsEnabled = CreateVirtualDirectoryButton.IsEnabled = isIISExpressInstalled; LocalIISGroup.IsEnabled = false; } void UseLocalIIS_Click(object sender, RoutedEventArgs e) { + properties.IISUrl = String.Format("{0}/{1}", WebBehavior.LocalHost, webProject.Name); SelectLocalIIS(); OnWebProjectPropertiesChanged(); } @@ -132,10 +129,6 @@ namespace ICSharpCode.AspNet.Mvc UseLocalIIS.IsChecked = false; } else { StatusLabel.Text = String.Empty; - if (String.IsNullOrEmpty(properties.IISUrl)) { - properties.IISUrl = String.Format("{0}/{1}", WebBehavior.LocalHost, ProjectService.CurrentProject.Name); - OnWebProjectPropertiesChanged(); - } ProjectUrl.Text = properties.IISUrl; } LocalIISGroup.IsEnabled = CreateVirtualDirectoryButton.IsEnabled = isIISInstalled; @@ -188,7 +181,7 @@ namespace ICSharpCode.AspNet.Mvc void PortTextBox_KeyUp(object sender, KeyEventArgs e) { properties.DevelopmentServerPort = Int32.Parse(PortTextBox.Text); - properties.IISUrl = String.Format(@"{0}:{1}/{2}", WebBehavior.LocalHost, PortTextBox.Text, ProjectService.CurrentProject.Name); + properties.IISUrl = String.Format(@"{0}:{1}/", WebBehavior.LocalHost, PortTextBox.Text); } } } \ No newline at end of file diff --git a/src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/WebProjectService.cs b/src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/WebProjectService.cs index 9781ea0d3b..35e8a84405 100644 --- a/src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/WebProjectService.cs +++ b/src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/WebProjectService.cs @@ -37,8 +37,6 @@ namespace ICSharpCode.AspNet.Mvc const string IIS_LOCATION = "Software\\Microsoft\\InetStp"; const string IIS_MAJOR_VERSION = "MajorVersion"; const string IIS_INSTALL_PATH = "InstallPath"; - const string DEFAULT_WEB_SITE = "Default Web Site"; - const string IIS_WEB_LOCATION = "IIS://localhost/W3SVC/1/Root"; const string ASPNET_REG_PATH = @"SOFTWARE\MICROSOFT\ASP.NET"; const string ASPNET_ROOT_VER = @"RootVer"; @@ -215,93 +213,5 @@ namespace ICSharpCode.AspNet.Mvc return IISVersion.None; } } - - /// - /// Creates a virtual directory in local IIS or IIS Express. - /// - /// Virtual directory name. - /// Physical path. - /// Error string or string null = no errors. - public static string CreateVirtualDirectory(WebServer webServer, string virtualDirectoryName, string physicalDirectoryPath) - { - try { - string iisNotFoundError = ResourceService.GetString("ICSharpCode.WebProjectOptionsPanel.IISNotFound"); - if (!IsIISOrIISExpressInstalled) - return iisNotFoundError; - - string error; - - switch(IISVersion) - { - case IISVersion.IIS5: - case IISVersion.IIS6: - var vr = new IISVirtualRoot(); - vr.Create(IIS_WEB_LOCATION, - physicalDirectoryPath, - virtualDirectoryName, - out error); - break; - default: - if (!IsIISExpressInstalled && (IISVersion == IISVersion.None)) - return iisNotFoundError; - - // TODO: find a better way to create IIS applications without Microsoft.Web.Administration.ServerManager - string name = "/" + virtualDirectoryName; - // load from GAC - Assembly webAdministrationAssembly = null; - try { - // iis installed - foreach(DomAssemblyName assembly in GacInterop.GetAssemblyList()) { - if (assembly.FullName.Contains("Microsoft.Web.Administration")) { - if (IsAssemblyForWebServer(webServer, assembly)) { - webAdministrationAssembly = Assembly.Load(assembly.FullName); - break; - } - } - } - } catch { - return iisNotFoundError; - } - if (webAdministrationAssembly == null) - return iisNotFoundError; - - // use dynamic because classic reflection is way TOO ugly - dynamic manager = webAdministrationAssembly.CreateInstance("Microsoft.Web.Administration.ServerManager"); - - if (manager.Sites[DEFAULT_WEB_SITE] != null) { - if (manager.Sites[DEFAULT_WEB_SITE].Applications[name] == null) { - manager.Sites[DEFAULT_WEB_SITE].Applications.Add(name, physicalDirectoryPath); - manager.CommitChanges(); - error = string.Empty; - } else { - error = ResourceService.GetString("ICSharpCode.WebProjectOptionsPanel.ApplicationExists"); - } - } else { - if (manager.Sites[0].Applications[name] == null) { - manager.Sites[0].Applications.Add(name, physicalDirectoryPath); - manager.CommitChanges(); - error = string.Empty; - } else { - error = ResourceService.GetString("ICSharpCode.WebProjectOptionsPanel.ApplicationExists"); - } - } - manager.Dispose(); - break; - } - - return error; - } - catch (Exception ex) { - return ex.Message; - } - } - - static bool IsAssemblyForWebServer(WebServer webServer, DomAssemblyName assembly) - { - if (webServer == WebServer.IISExpress) { - return (assembly.Version.Major == 7) && (assembly.Version.Minor == 9); - } - return true; - } } } diff --git a/src/AddIns/BackendBindings/AspNet.Mvc/Test/Src/WebProjectTests.cs b/src/AddIns/BackendBindings/AspNet.Mvc/Test/Src/WebProjectTests.cs index 729f19e4db..39ea865f1e 100644 --- a/src/AddIns/BackendBindings/AspNet.Mvc/Test/Src/WebProjectTests.cs +++ b/src/AddIns/BackendBindings/AspNet.Mvc/Test/Src/WebProjectTests.cs @@ -272,5 +272,29 @@ namespace AspNet.Mvc.Tests Assert.IsFalse(contains); } + + [Test] + public void Name_MSBuildProjectNameIsTest_ReturnsTest() + { + CreateMSBuildProject(); + msbuildProject.Name = "Test"; + CreateWebProject(msbuildProject); + + string name = webProject.Name; + + Assert.AreEqual("Test", name); + } + + [Test] + public void Directory_MSBuildProjectDirectoryIsSet_ReturnsMSBuildProjectDirectory() + { + CreateMSBuildProject(); + msbuildProject.FileName = @"c:\projects\Test\test.csproj"; + CreateWebProject(msbuildProject); + + string directory = webProject.Directory; + + Assert.AreEqual(@"c:\projects\Test", directory); + } } }