解决 如何在我的控制器内使用WebRootPath?

DESTRO

活跃的成员
加入
3月28日,2020年
消息
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 HomeController : Controller
    {
        private readonly IAstrologerRepository _astrologerRepository;
        private readonly IHostingEnviroment _hostingEnviroment;

        public HomeController(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();
        }
    }
 

约翰

C#论坛主持人
工作人员
加入
2011年4月23日
消息
1,152
地点
挪威
编程经验
10+
警告 - 此API现已过时。

这种类型已过时,将在未来的版本中删除。推荐的替代方案是Microsoft.aspNetCore.Hosting.iWebhostenvironment。
Iwebhostenvironment. also has a WebRootPath property.
 

跳伞运动员

工作人员
加入
2019年4月6日
消息
2,849
地点
切萨皮克,va.
编程经验
10+
此外,在大多数IIS环境中,在大多数IIS环境中,只有在Web根目录上只有读取权限,但是使用IIS和ASP.NET给予App_Data目录的读写权限,提供额外的安全性以防止J.随机Web用户从直接浏览到App_Data以收取它们不应该访问的任何数据或文件。显然,这可以被覆盖,但一般来说,您应该尊重此约定,而不是将文件写入Web Root。想象一下,如果用户可以将文件上传到您的Web root,并且他们可以控制文件名:hissher先生将默认为Web root上载到您的网站,现在您的网站已被劫持;或者登录.aspx开始收获用户名和密码;或者覆盖您的设置的Web.config;等等。是的,我知道您正在使用keestrel,而不是绑定IIS所做的,但请考虑访问Web Root的含义。
 

DESTRO

活跃的成员
加入
3月28日,2020年
消息
36
编程经验
1-3

Iwebhostenvironment. also has a WebRootPath property.

我正在使用ASP.NET Core 2.1在VS社区2017年我仍然在我的控制器中使用IWebHostenvionment注入而不是ihostingenvironment注入?
 
Last edited:

DESTRO

活跃的成员
加入
3月28日,2020年
消息
36
编程经验
1-3
此外,在大多数IIS环境中,在大多数IIS环境中,只有在Web根目录上只有读取权限,但是使用IIS和ASP.NET给予App_Data目录的读写权限,提供额外的安全性以防止J.随机Web用户从直接浏览到App_Data以收取它们不应该访问的任何数据或文件。显然,这可以被覆盖,但一般来说,您应该尊重此约定,而不是将文件写入Web Root。想象一下,如果用户可以将文件上传到您的Web root,并且他们可以控制文件名:hissher先生将默认为Web root上载到您的网站,现在您的网站已被劫持;或者登录.aspx开始收获用户名和密码;或者覆盖您的设置的Web.config;等等。是的,我知道您正在使用keestrel,而不是绑定IIS所做的,但请考虑访问Web Root的含义。
这真的是启发 @skydiver but
我只是在自定义文件输入控制上使用它,以保存用户的上传配置文件。我应该把它放在其他地方吗?我将使用身份验证用户允许它们更改其配置文件图片。我应该和其他一些方法一起去吗?

它将在未来托管在线,我甚至不确定如何访问此项目中的WebRootPath。 @Johnh. 建议使用iwebhostenvironment。我应该从startup.cs和homecontroller.cs中清除ihostingenvirooment,以将iwebhostenvironment放在何处吗?
 
Last edited:

跳伞运动员

工作人员
加入
2019年4月6日
消息
2,849
地点
切萨皮克,va.
编程经验
10+
如果您知道您的应用程序只能在单台机器上终止直到时间结束,我只推荐给本地文件系统。对于Web应用程序,可以选择缩放(通过添加更多CPU,RAM,磁盘空间等)或缩放(通过在负载平衡器后面添加更多机器)。缩放通常比缩放更便宜。现在映像如果您的用户将其图片上传到机器1,则将来自同一用户的下一个Web请求发送到机器2.现在他们的照片在哪里?

是的,您可以使用本地文件系统进行您知道的内容,如您想要在拍摄图像上进行的图像上传,如图所示的图像上载,在拍摄图像之前是更耐用的和可靠的机器正在访问它(例如文件分享或数据库)。

如果您仍然在学习曲线上,这是一个玩具应用程序或一个简单的原型,那么请继续并在本地保存。只是确保提醒您的管理团队,原型不是生产准备。
 

跳伞运动员

工作人员
加入
2019年4月6日
消息
2,849
地点
切萨皮克,va.
编程经验
10+
出于好奇,为什么你甚至需要网络根路径。如果这是基于Kerestel的应用程序,则默认运行环境将当前目录设置为包含Web应用程序可执行文件的相同目录。只需使用相对路径。或者有一些不成文的约束或要求,迫使您需要完整的路径?
 

跳伞运动员

工作人员
加入
2019年4月6日
消息
2,849
地点
切萨皮克,va.
编程经验
10+
我正在使用asp.net核心2.1
适用于.NET核心2.1的终端.1是2021年8月21日。也可以提前计划并转到.NET核心3.1,其中寿命更长:2022年12月3日。
 

DESTRO

活跃的成员
加入
3月28日,2020年
消息
36
编程经验
1-3
出于好奇,为什么你甚至需要网络根路径。如果这是基于Kerestel的应用程序,则默认运行环境将当前目录设置为包含Web应用程序可执行文件的相同目录。只需使用相对路径。或者有一些不成文的约束或要求,迫使您需要完整的路径?
实际上,我仍然在学习曲线上,遵循一个视频,它使用了构造函数注入ihostingen环境并使用其WebRootPath属性来保存用户在IaptionSult类型的创建动作内容上载的配置文件映像。我做了同样的,但我的ihostingen环境界面是空的,没有属性根本。
 

DESTRO

活跃的成员
加入
3月28日,2020年
消息
36
编程经验
1-3
ahaa ......我修好了它。我正在使用托管环境的错误界面。我不得不实现Microsoft.aspnetCore.hosting的那个,列表中有两个。一个来自构造函数,另一个是使用命名空间。我将类型更改为使用命名空间和所有属性都在接口。谢谢大家建议。 @skydiver @Johnh.。一旦我掌握所有CRUD操作,我将在一个月内更新到3.1。
 
最佳 底部