| DataDirectory |的位置在WebApi项目/模板中

时间:2015-05-11 04:09:24

标签: c# entity-framework asp.net-web-api

我确实知道如何更改| DataDirectory |的值有很多问题。我的问题略有不同。

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

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

由于

1 个答案:

答案 0 :(得分: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));
}

我在DbConnectionOptions.cs文件下的System.Data.Common程序集中找到了另一段代码。这是代码。

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来反编译这些程序集。我希望同样可以帮助你。