使用EF7命令时,IHostingEnvironment.WebRootPath为null

时间:2016-02-10 17:37:16

标签: asp.net-core asp.net-core-mvc entity-framework-core

问题

当我尝试向我的代码添加迁移时,例如:dnx ef migrations add initial

env.WebRootPath中的Startup(IHostingEnvironment env)为空。

这将在添加新迁移或更新数据库时给出编译错误。

守则

Startup.cs 类中,我在构造函数中有以下几行:

public Startup(IHostingEnvironment env)
{
    // ...
    MyStaticClass.Initialize(env.WebRootPath);
    // ...
    _hostingEnvironment = env;
}

此处env.WebRootPath为空,在Initialize函数中会引发异常。

Startup.cs ConfigureServices 函数中,我解析了我的类依赖项:

public void ConfigureServices(IServiceCollection services)
{
    // ...
    services.AddInstance<IMyService>(new MyService(_hostingEnvironment.WebRootPath))
    // Note: _hostingEnvironment is set in the Startup constructor.
    // ...
}

备注

  • 我可以构建,运行和部署代码。一切正常!

  • 但是我在模型中进行了更改,并希望使用此命令添加迁移:dnx ef migrations add MyMigration然后我在包管理器控制台中看到编译错误。

  • 我正在使用ASP 5 Web应用程序和Entity Framework 7

7 个答案:

答案 0 :(得分:20)

如果无意中从项目的根目录中删除了wwwroot文件夹,则env.WebRootPath也可以为null。将wwwroot文件夹添加到项目的根目录也可以解决此问题。

答案 1 :(得分:9)

关于我的问题,github上报告了一个问题:

https://github.com/aspnet/EntityFramework/issues/4494

我在评论中使用了解决方法,现在似乎工作正常:

if (string.IsNullOrWhiteSpace(_env.WebRootPath))
{
   env.WebRootPath = Path.Combine(Directory.GetCurrentDirectory(), "wwwroot");
}

答案 2 :(得分:4)

在我的情况下,问题是wwwroot文件夹是空的,VS没有识别它。

解决方案:在wwwroot中创建一个placeholder.txt。

希望它有所帮助。

答案 3 :(得分:4)

我相信此线程是找出此问题答案的最佳方法。

方法1:

我花了一些时间寻找答案,我发现解决这个问题而不是检查路径是否存在(在控制器或方法中)的方法是更新Program.cs:

    public static async Task Main(string[] args)
    {
        IWebHost webHost = CreateWebHostBuilder(args).Build();

        await webHost.RunAsync();
    }

    private static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
        WebHost.CreateDefaultBuilder(args)
            .UseContentRoot(Directory.GetCurrentDirectory())
            .UseWebRoot("wwwroot")
            .UseStartup<Startup>();

这样,您将确保有一个webroot文件夹可以在其中放置文件,并且_environment.webRootPath不会为空,您甚至可以自定义文件夹的名称。

方法2

执行此操作的第二个选项是在Visual Studio级别的项目中手动添加“ wwwroot”文件夹。程序应将其选中并分配为wwwroot文件夹:

Method no 2

答案 4 :(得分:0)

如果有人仍然面临这个问题,在我的情况下,问题是我为测试创建它的默认构造函数。

因此,删除默认构造函数(如果有)。

答案 5 :(得分:0)

在使用Telerik控件的asp.net核心应用程序中上载文件时出现错误。该错误与Telerik控制无关。

在进行调查时,我得到的描述是,这是变量,其功能与Server.MapPath中的asp.net

好的解释:-What is the equivalent of Server.MapPath in ASP.NET Core?

//this code from above link that how it will be used in the code
public class HomeController : Controller
{
    private readonly IHostingEnvironment _hostingEnvironment;

    public HomeController(IHostingEnvironment hostingEnvironment)
    {
        _hostingEnvironment = hostingEnvironment;
    }

    public ActionResult Index()
    {
        string webRootPath = _hostingEnvironment.WebRootPath;
        string contentRootPath = _hostingEnvironment.ContentRootPath;

        return Content(webRootPath + "\n" + contentRootPath);
    }
}

这是给我错误的实际代码,我用另一种解决问题的方法替换了WebRootPath,并且它可以工作。您可以在整个应用程序中进行分配和使用。

public async Task<ActionResult> SaveAsync(IEnumerable<IFormFile> files)
        {
            // The Name of the Upload component is "files"
            if (files != null)
            {
                foreach (var file in files)
                {
                    var fileContent = ContentDispositionHeaderValue.Parse(file.ContentDisposition);

                    // Some browsers send file names with full path.
                    // We are only interested in the file name.
                    var fileName = Path.GetFileName(fileContent.FileName.ToString().Trim('"'));

                    //The below line gives the error
                    //var physicalPath = Path.Combine(HostingEnvironment.WebRootPath, "App_Data", fileName);

                    //and I replace with this (but we can use this variable at multiple location by assign a physical path)
                    var physicalPath = Path.Combine(Path.Combine(Directory.GetCurrentDirectory(), "wwwroot"), "App_Data", fileName);

                    //The files are not actually saved in this demo
                    using (var fileStream = new FileStream(physicalPath, FileMode.Create))
                    {
                        await file.CopyToAsync(fileStream);
                    }
                }
            }

            // Return an empty string to signify success
            return Content("");
        }

答案 6 :(得分:0)

我也遇到了同样的问题,但是这篇文章似乎是一个独特的情况,所以我将其添加。

我有几个嵌套项目的解决方案。与此类似:

> Solution
  > MvcProject
    > wwwroot
    > // etc.
  > SecondMvcProject
  > AnotherMvcProject

运行我的MvcProject时,IHostingEnvironment的{​​{1}}设置为ContentRootPath文件夹,而Solution为空。

根据其他人的回答,在WebRootPath文件夹中添加一个wwwroot文件夹,使Solution拥有一个值,但这是WebRootPath文件夹路径。我必须在VS Code中修改启动任务的当前工作目录(Solution)。它默认为cwd,我不得不将其更改为"cwd": "${workspaceFolder}"

更新

我在另一台机器上又遇到了同样的问题,很高兴我对此发表了评论。这次的问题是,我们的"cwd": "${workspaceFolder}/MvcProject"文件夹之一中没有任何文件,并且空文件夹没有提交给git repos。如果需要,将文件添加到您的文件夹中!

(在那里与静态文件处理的设置保持一致。在项目启动之前,我们最终会在其中找到一些东西!)