return r;
}
+#if NET_2_0
static object create_dir = new object ();
- static void CreateDirectory (string directory)
+#endif
+
+ internal static bool ClearDynamicBaseDirectory (string directory)
+ {
+ string[] entries = null;
+
+ try {
+ entries = Directory.GetDirectories (directory);
+ } catch {
+ // ignore
+ }
+
+ bool dirEmpty = true;
+ if (entries != null && entries.Length > 0) {
+ foreach (string e in entries) {
+ if (ClearDynamicBaseDirectory (e)) {
+ try {
+ Directory.Delete (e);
+ } catch {
+ dirEmpty = false;
+ }
+ }
+ }
+ }
+
+ try {
+ entries = Directory.GetFiles (directory);
+ } catch {
+ entries = null;
+ }
+
+ if (entries != null && entries.Length > 0) {
+ foreach (string e in entries) {
+ try {
+ File.Delete (e);
+ } catch {
+ dirEmpty = false;
+ }
+ }
+ }
+
+ return dirEmpty;
+ }
+
+ static bool CreateDirectory (string directory)
{
#if NET_2_0
lock (create_dir) {
- if (!Directory.Exists (directory))
+#endif
+ if (!Directory.Exists (directory)) {
Directory.CreateDirectory (directory);
+ return false;
+ } else
+ return true;
+#if NET_2_0
}
-#else
- Directory.CreateDirectory (directory);
#endif
}
+ static string GetBinPath (string physicalDir)
+ {
+ string ret = Path.Combine (physicalDir, "Bin");
+ if (Directory.Exists (ret))
+ return ret;
+ ret = Path.Combine (physicalDir, "bin");
+ return ret;
+ }
+
//
// For further details see `Hosting the ASP.NET runtime'
//
// http://www.west-wind.com/presentations/aspnetruntime/aspnetruntime.asp
//
+#if TARGET_JVM
+ [MonoNotSupported ("")]
+#endif
[SecurityPermission (SecurityAction.Demand, UnmanagedCode = true)]
public static object CreateApplicationHost (Type hostType, string virtualDir, string physicalDir)
{
if (physicalDir == null)
throw new NullReferenceException ();
-#if NET_2_0
+ // Make sure physicalDir has file system semantics
+ // and not uri semantics ( '\' and not '/' ).
physicalDir = Path.GetFullPath (physicalDir);
-#endif
- // This might throw
- Uri u = new Uri (physicalDir);
- physicalDir = HttpUtility.UrlDecode (u.AbsolutePath);
if (hostType == null)
- throw new NullReferenceException ();
+ throw new ArgumentException ("hostType can't be null");
if (virtualDir == null)
- throw new NullReferenceException ();
+ throw new ArgumentNullException ("virtualDir");
Evidence evidence = new Evidence (AppDomain.CurrentDomain.Evidence);
-
- //
- // Unique Domain ID
- //
- string domain_id = "ASPHOST_" + DateTime.Now.ToString().GetHashCode().ToString("x");
//
// Setup
setup.ApplicationBase = physicalDir;
setup.CachePath = null;
- setup.ApplicationName = domain_id;
setup.ConfigurationFile = FindWebConfig (physicalDir);
setup.DisallowCodeDownload = true;
- string bin_path = Path.Combine (physicalDir, "bin");
+ string bin_path = GetBinPath (physicalDir);
setup.PrivateBinPath = bin_path;
setup.PrivateBinPathProbe = "*";
setup.ShadowCopyFiles = "true";
string dynamic_dir = null;
string user = Environment.UserName;
+ int tempDirTag = 0;
+
for (int i = 0; ; i++){
string d = Path.Combine (Path.GetTempPath (),
String.Format ("{0}-temp-aspnet-{1:x}", user, i));
CreateDirectory (stamp);
dynamic_dir = d;
Directory.Delete (stamp);
+ tempDirTag = i.GetHashCode ();
break;
} catch (UnauthorizedAccessException){
continue;
}
}
+ //
+ // Unique Domain ID
+ //
+ string domain_id = (virtualDir.GetHashCode () ^ physicalDir.GetHashCode () ^ tempDirTag).ToString ("x");
+
+ setup.ApplicationName = domain_id;
setup.DynamicBase = dynamic_dir;
- CreateDirectory (setup.DynamicBase);
+
+ string dynamic_base = setup.DynamicBase;
+ if (CreateDirectory (dynamic_base) && (Environment.GetEnvironmentVariable ("MONO_ASPNET_NODELETE") == null))
+ ClearDynamicBaseDirectory (dynamic_base);
//
// Create app domain
appdomain.SetData (".domainId", domain_id);
appdomain.SetData (".hostingVirtualPath", virtualDir);
appdomain.SetData (".hostingInstallDir", Path.GetDirectoryName (typeof (Object).Assembly.CodeBase));
-
+#if NET_2_0
+ appdomain.SetData ("DataDirectory", Path.Combine (physicalDir, "App_Data"));
+#endif
return appdomain.CreateInstanceAndUnwrap (hostType.Module.Assembly.FullName, hostType.FullName);
}
}