解决  如何在控制器内使用webRootPath?

毁灭

活跃的成员
已加入
2020年3月28日
留言内容
36
编程经验
1-3
我正在尝试使用homecontroller将图像上传到wwwroot路径,但是我的IhostingEnvironment接口没有名为WebRootPath的此类属性,实际上,当我查看该定义时,它根本没有任何属性。如何在HomeController中访问此路径?

Startup.cs:
public class Startup
    {
        private IConfiguration _config;
        public Startup(IConfiguration config)
        {
            _config = config;
        }
      
        // This method gets called by the runtime. Use this method to add services to the container.
        // For more information on how to configure your application, visit //go.microsoft.com/fwlink/?LinkID=398940
        public void ConfigureServices(IServiceCollection services)
        {
            services.AddScoped<IAstrologerRepository, SQLAstrologerRepository>();

            services.AddMvc();
            services.AddDbContextPool<ApplicationDbContext>(options =>
     options.UseSqlServer(_config.GetConnectionString("DefaultConnection")));
         
        }

        // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
        public void Configure(IApplicationBuilder app, IHostingEnvironment env)
        {
         

            if (env.IsDevelopment())
            {
                app.UseDeveloperExceptionPage();
            }
            else
            {
                app.UseExceptionHandler("/Home/Error");
                app.UseHsts();
            }
            app.UseHttpsRedirection();
            app.UseStaticFiles();
            app.UseAuthentication();
            app.UseCookiePolicy();

            app.UseMvc(routes =>
            {
                routes.MapRoute(
                    name: "default",
                    template: "{controller=Home}/{action=Index}/{id?}");

                routes.MapRoute(name: "login",
                    template: "{controller=Home}/{action=Login}");
              
            });

        }
    }


HomeController.cs:
[CODE lang="csharp" title="Startup.cs"]
public class  家 Controller : Controller
    {
        private readonly IAstrologerRepository _astrologerRepository;
        private readonly IHostingEnviroment _hostingEnviroment;

        public  家 Controller(IAstrologerRepository astrologerRepository, IHostingEnviroment hostingEnviroment)
        {

            _astrologerRepository = astrologerRepository;
            _hostingEnviroment = hostingEnviroment;
        }


        // GET: /<controller>/
        public ViewResult Index()
        {
            var model = _astrologerRepository.GetAllAstrologers();
            return View(model);
        }

    
        [HttpGet]
        public ViewResult SignUp()
        {
          
            return View();
        }
        [HttpPost]
        public IActionResult SignUp(AstrologerCreateViewModel model)
        {
            if (ModelState.IsValid)
            {
             //   string fileName = null;
                if(model.profilephoto!=null)
                {
                  
                
                }
               // Astrologer newastrologer = _astrologerRepository.Add(astrologer);
                return RedirectToAction("Index");
            }
            return View();
        }
    }
 

约翰·H

C#论坛主持人
工作人员
已加入
2011年4月23日
留言内容
1,028
地点
挪威
编程经验
10+
警告-该API现在已过时。

此类型已过时,将在以后的版本中删除。推荐的替代方法是Microsoft.AspNetCore.Hosting.IWebHostEnvironment。
IWebHost环境 also has a WebRootPath property.
 

跳伞

工作人员
已加入
2019年4月6日
留言内容
2,497
地点
弗吉尼亚州切萨皮克
编程经验
10+
另外,在大多数IIS环境中,只是在Web根目录上启用了读取权限,但是通过IIS和ASP.NET为App_Data目录提供了读写权限,从而提供了额外的安全性来防止J. Random Web User从直接浏览到App_Data以收获他们不应该访问的任何数据或文件。显然,这可以被覆盖,但是通常您应该遵守该约定,而不要将文件写入Web根目录。想象一下,如果用户可以将文件上传到您的Web根目录并可以控制文件名,将会发生什么情况:黑客先生来了,他将default.htm上传到您的Web根目录,现在您的网站已被劫持;或login.aspx开始收集用户名和密码;或web.config覆盖您的设置;是的,我知道您使用的是Kestrel,不受IIS的限制,但是请考虑访问Web根的含义。
 

毁灭

活跃的成员
已加入
2020年3月28日
留言内容
36
编程经验
1-3

IWebHost环境 also has a WebRootPath property.

我正在使用asp.net core 2.1 in VS community 2017 should I still use IWebHost环境 injection in my controller instead of IHostingEnvironment injection??
 
Last edited:

毁灭

活跃的成员
已加入
2020年3月28日
留言内容
36
编程经验
1-3
另外,在大多数IIS环境中,只是在Web根目录上启用了读取权限,但是通过IIS和ASP.NET为App_Data目录提供了读写权限,从而提供了额外的安全性来防止J. Random Web User从直接浏览到App_Data以收获他们不应该访问的任何数据或文件。显然,这可以被覆盖,但是通常您应该遵守该约定,而不要将文件写入Web根目录。想象一下,如果用户可以将文件上传到您的Web根目录并可以控制文件名,将会发生什么情况:黑客先生来了,他将default.htm上传到您的Web根目录,现在您的网站已被劫持;或login.aspx开始收集用户名和密码;或web.config覆盖您的设置;是的,我知道您使用的是Kestrel,不受IIS的限制,但是请考虑访问Web根的含义。
真的很启发 @跳伞
我只是在自定义文件输入控件上使用它来保存用户的上传个人资料照片。我应该把它放在其他地方吗?我将对用户使用身份验证,以允许他们更改其个人资料照片。我是否应该采用其他方法?

将来肯定会在线托管它,我什至不确定如何在此项目中访问webrootpath。 @约翰·H suggested using IWebHost环境. Should I clear out the IHostingEnviroment from startup.cs 和 homecontroller.cs to place IWebHost环境 instead?
 
Last edited:

跳伞

工作人员
已加入
2019年4月6日
留言内容
2,497
地点
弗吉尼亚州切萨皮克
编程经验
10+
我只建议保存到本地文件系统,如果您知道您的应用程序从现在起到时间结束将只能在单台计算机上运行。对于Web应用程序,可以选择扩展(通过添加更多的CPU,RAM,磁盘空间等)或扩展(通过在负载均衡器后面添加更多的机器)。向外扩展通常比向上扩展便宜。现在,如果您的用户将其图片上传到计算机1,并且来自同一用户的下一个Web请求被发送到计算机2,则进行成像。

是的,您可以将本地文件系统用于您知道是瞬态的事物(例如图片上传),您希望在放置图片之前对其进行一些后处理,这样可以更持久并且与哪个机器正在访问它无关(例如文件)共享或数据库)。

如果您仍处于学习过程中,并且这是一个玩具应用程序或简单的原型,请继续并在本地保存l。只需确保提醒您的管理团队该原型尚未投入生产即可。
 

跳伞

工作人员
已加入
2019年4月6日
留言内容
2,497
地点
弗吉尼亚州切萨皮克
编程经验
10+
出于好奇,您为什么甚至需要网络根目录路径。如果这是基于Kestrel的应用程序,则默认的运行环境会将当前目录设置为包含Web应用程序可执行文件的目录。只需使用相对路径即可。还是有一些不成文的约束或要求迫使您需要完整的路径?
 

跳伞

工作人员
已加入
2019年4月6日
留言内容
2,497
地点
弗吉尼亚州切萨皮克
编程经验
10+
我正在使用asp.net core 2.1
.NET Core 2.1的生命周期终止于2021年8月21日。可能还需要提前计划,然后转到寿命更长的.NET Core 3.1:2022年12月3日。
 

毁灭

活跃的成员
已加入
2020年3月28日
留言内容
36
编程经验
1-3
出于好奇,您为什么甚至需要网络根目录路径。如果这是基于Kestrel的应用程序,则默认的运行环境会将当前目录设置为包含Web应用程序可执行文件的目录。只需使用相对路径即可。还是有一些不成文的约束或要求迫使您需要完整的路径?
实际上,我仍处于学习曲线中,我正在观看一个视频,该视频使用IHostingEnvironment的构造函数注入,并使用其webrootpath属性将用户上传的配置文件图像保存在IActionResult类型的create动作中。我做了同样的事情,但是我的IHostingEnvironment接口是空的,没有任何属性。
 

毁灭

活跃的成员
已加入
2020年3月28日
留言内容
36
编程经验
1-3
阿哈...我修好了。我使用了错误的主机环境接口。我必须实现Microsoft.AspNetCore.Hosting附带的一个,列表中有两个。一种来自构造函数,另一种使用命名空间。我将类型更改为使用名称空间进行接口,并且所有属性都在那里。感谢您的宝贵意见。 @跳伞 @约翰·H 。一旦掌握了所有CRUD操作后,我将在一个月内更新到3.1。
 
最佳 底部