Asp.net HttpContext不存在

Asp.net HttpContext不存在,asp.net,visual-studio,asp.net-core,Asp.net,Visual Studio,Asp.net Core,编辑:不重复,请查看解决方案。所需的解决方案与给定的可能重复链接不同 我正在尝试将记录简单地插入到数据库中,该数据库也包含imagePath,因此需要上传文件。像这样: public async Task<IActionResult> CreateArtifact(CreateArtifactViewModel input) { try { var path="";

编辑:不重复,请查看解决方案。所需的解决方案与给定的可能重复链接不同

我正在尝试将记录简单地插入到数据库中,该数据库也包含imagePath,因此需要上传文件。像这样:

public async Task<IActionResult> CreateArtifact(CreateArtifactViewModel input)
        {
            try
            {
                var path="";
                if (input.File != null)
                {
                    var fileName = Path.GetFileName(input.File.FileName);
                    path = Path.Combine(System.Web.HttpContext.Current.Server.MapPath("~/Images/"), fileName);
                    file.SaveAs(path);
                }
//rest of the method (irrelevant)...
public异步任务CreateArtifact(CreateArtifactViewModel输入)
{
尝试
{
var路径=”;
if(input.File!=null)
{
var fileName=Path.GetFileName(input.File.fileName);
path=path.Combine(System.Web.HttpContext.Current.Server.MapPath(“~/Images/”),文件名);
file.SaveAs(路径);
}
//方法的其余部分(不相关)。。。
但在执行MapPath的部分中,我得到了一个错误,即HttpContext在System.Web中不存在

做了一些研究并尝试“添加引用”。但是“添加引用”窗口是空的,只有解决方案中的辅助项目可见。因此我通过浏览添加了System.web.dll引用。但仍然没有机会。我是否遗漏了什么,我能做些什么


谢谢。

在ASP.NET Core中,
服务器和
服务器.MapPath
不存在-它们是System.Web的一部分,System.Web不是.NET Core堆栈的一部分。相反,您可以使用
IHostingEnvironment
plus
System.IO.Path
的一个实例来构建正确的路径。类似如下:

公共类控制器:控制器
{
私有只读IHostingEnvironment主机环境;
公共控制器(IHostingEnvironment env)
{
hostingEnvironment=env??抛出新的ArgumentNullException(nameof(env));
}
}
然后,您的代码将更改为类似以下内容:

public异步任务CreateArtifact(CreateArtifactViewModel输入)
{
尝试
{
var路径=”;
if(input.File!=null)
{
var fileName=Path.GetFileName(input.File.fileName);
//这将产生如下结果:
//c:\inetpub\yourappname\wwwroot\images\image-file-name.png
path=path.Combine(hostingEnvironment.WebRootPath,“图像”,文件名);
使用(var fs=System.IO.File.Open(path,FileMode.Create))
{
文件.OpenReadStream().CopyTo(fs);
fs.Flush();
}
}
//…剩下的代码
}
您是使用
WebRootPath
还是
ContentRootPath
取决于
~/Images
所在的位置-
WebRootPath
映射到
wwwroot
目录,该目录通常是可服务文件所在的位置

您需要对Startup.cs文件进行一些更改,以便通过以下方式注入
IHostingEnvironment

公共类启动
{
私有只读IHostingEnvironment主机环境;
公共启动(IConfiguration配置,IHostingEnvironment环境)
{
配置=配置;
hostingEnvironment=env;
}
public void配置服务(IServiceCollection服务)
{
AddSingleton(hostingEnvironment.ContentRootFileProvider);
//…其余的配置服务
}
//…Startup.cs的其余部分
}

在这之后,您可以将
IHostingEnvironment
注入控制器、视图组件等,在其中您需要获取站点根目录的路径,以及其他用途。

您的返回类型是
IActionResult
,这实际上是一个.NET核心项目吗?这是由于最近对文件上载方法的更改。我们曾经实现过blob m用于文件上传的管理器。所以这并不重要。这是.Net Core 2.2 web项目。而且.Net Core通常不引用System.web。您应该将
IHostingEnvironment
实例注入控制器,并使用该实例获取网站根目录(或内容根目录,取决于您试图映射的内容)。此外,这使得您的一些标记不正确-asp.net-core有一个特定的标记,它不是asp.net-mvc或asp.net-mvc-4。我认为这将导致解决方案,但在第一个代码段中定义了什么env?我们应该传递给它什么?顺便说一句,谢谢。
env
IHostingEnviro的一个实例这将被注入控制器的构造函数,并使用您配置的依赖项注入服务(ASP.NET Core有一个内置的DI服务,尽管有些简单)。另一件事是input.file.SaveAs(path)不是有效的方法,input.file.CopyTo(path)是可用的,但我得到了一个“无法从字符串转换为System.IO.Stream”我刚从您的代码中复制了它。很可能,
input.File
ifformfile
的一个实例,它没有保存方法。我已更新了该示例,以显示写入该文件的一种方法。