2015-05-11 39 views
1

我知道这里有很多关于如何更改| DataDirectory |的值的问题。我的问题稍有不同。位置| DataDirectory |在WebApi项目/模板中

我意识到如果您在EntityFramework中使用WebApi项目,那么| DataDirectory |指向默认创建的App_Data文件夹。我相信MVC项目也是如此。

所以我的问题是我在哪里可以找到指定App_Data的代码为| DataDirectory |在这些标准模板中。我只想为我的类库使用相同的代码

谢谢

回答

2

| DataDirectory |在System.Web程序集的HttpRuntime类中定义。

我反编译System和System.Web程序集,我发现了AppDomain类的源代码和一些与DataDirectory相关的代码如下。

App_Data是程序集中的硬编码字符串。但是可以使用AppDomain.CreateDomain()方法重写它。

这是我找到的代码。在的httpRuntime类

internal const string DataDirectoryName = "App_Data"; 

全局变量在类的httpRuntime

private void SetUpDataDirectory() 
{ 
     string path = Path.Combine(this._appDomainAppPath, "App_Data"); 
     AppDomain.CurrentDomain.SetData("DataDirectory", (object) path, (IPermission) new FileIOPermission(FileIOPermissionAccess.PathDiscovery, path)); 
} 

函数我发现System.Data.Common组件另一段代码下DbConnectionOptions.cs文件。这是代码。

internal const string DataDirectory = "|datadirectory|"; 

然后我在SqlConnectionHelper类下的System.Web.DataAccess程序集中发现了另一个代码。这是代码。

[PermissionSet(SecurityAction.Assert, Unrestricted = true)] 
internal static string GetDataDirectory() 
{ 
     if (HostingEnvironment.IsHosted) 
     return Path.Combine(HttpRuntime.AppDomainAppPath, "App_Data"); 
     string path1 = AppDomain.CurrentDomain.GetData("DataDirectory") as string; 
     if (string.IsNullOrEmpty(path1)) 
     { 
     string path1_1 = (string) null; 
     Process currentProcess = Process.GetCurrentProcess(); 
     ProcessModule processModule = currentProcess != null ? currentProcess.MainModule : (ProcessModule) null; 
     string path2 = processModule != null ? processModule.FileName : (string) null; 
     if (!string.IsNullOrEmpty(path2)) 
      path1_1 = Path.GetDirectoryName(path2); 
     if (string.IsNullOrEmpty(path1_1)) 
      path1_1 = Environment.CurrentDirectory; 
     path1 = Path.Combine(path1_1, "App_Data"); 
     AppDomain.CurrentDomain.SetData("DataDirectory", (object) path1, (IPermission) new FileIOPermission(FileIOPermissionAccess.PathDiscovery, path1)); 
     } 
     return path1; 
} 

这意味着,| DataDirectory |在多个地方定义和使用。但是获取数据的常见位置来自HttpRuntime和AppDomain属性。

我使用JetBrain的DotPeek来反编译这些程序集。我希望同样可以帮助你。