ASP.Net core 中Server.MapPath的替换方法

       最近忙着将原来的asp.net项目迁移到asp.net core平台,整体还比较顺利,但其中也碰到不少问题,其中比比较值得关注的一个问题是,在netcore平台中,System.Web程序集已经取消了,要获取HttpContext并不是太容易,好在通过依赖注入,还是可以得到的,具体方法不在本文的讨论范围,大家可以自行百度。但是在得到了netcore版本的HttpContext后,发现已经不再有Server.MapPath函数了,而这个函数在以前是会被经常引用到的。

      通过百度研究,发现也是有替代方法的,依然是通过强大的依赖注入,代码如下:

using Microsoft.AspNetCore.Hosting;
using Microsoft.AspNetCore.Mvc;

namespace AspNetCorePathMapping
{
    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的使用,基本可以达到Server.MapPath同样的效果。但是这是在controller类中使用,如果是在普通类库中改怎么获取呢,或者有没有更简洁的方法呢?答案是肯定的,先上代码:

using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Hosting;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
using System;
using System.Collections.Generic;
using System.Text;
using System.IO;

namespace HH.Util
{
    public static class CoreHttpContext 
    {        
        private static Microsoft.AspNetCore.Hosting.IHostingEnvironment _hostEnviroment;       
        public static string WebPath => _hostEnviroment.WebRootPath;

        public static string MapPath(string path)
        {
            return Path.Combine(_hostEnviroment.WebRootPath, path);
        }

        internal static void Configure(Microsoft.AspNetCore.Hosting.IHostingEnvironment hostEnviroment) 
        { 
            _hostEnviroment = hostEnviroment;
        }
    } 
    public static class StaticHostEnviromentExtensions
    { 
        public static IApplicationBuilder UseStaticHostEnviroment(this IApplicationBuilder app) 
        { 
            var webHostEnvironment = app.ApplicationServices.GetRequiredService();
            CoreHttpContext.Configure(webHostEnvironment); 
            return app; 
        }
    } 
}

    然后在Startup.cs的Configure方法中:

app.UseStaticHostEnviroment();

      这样的话,只需要将原来的Server.Path替换为CoreHttpContext.MapPath就可以了,移植难度大大降低。

你可能感兴趣的:(asp.net,core,web,asp.net,后端,c#)