问题
当我尝试向我的代码添加迁移时,例如: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
答案 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文件夹:
答案 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。如果需要,将文件添加到您的文件夹中!
(在那里与静态文件处理的设置保持一致。在项目启动之前,我们最终会在其中找到一些东西!)