programing

서버와 동등한 것은 무엇입니까?ASP.NET Core의 MapPath?

muds 2023. 5. 21. 12:01
반응형

서버와 동등한 것은 무엇입니까?ASP.NET Core의 MapPath?

컨트롤러에 복사하고 싶은 코드에 이 줄이 있는데 컴파일러가 다음과 같이 불평합니다.

'서버' 이름이 현재 컨텍스트에 없습니다.

var UploadPath = Server.MapPath("~/App_Data/uploads")

ASP.NET Core에서 동등한 성능을 발휘하려면 어떻게 해야 합니까?

.NET 6(.NET Core 3 이상)

예를 들어 찾고자 하는 경우~/wwwroot/CSS

public class YourController : Controller
{
    private readonly IWebHostEnvironment _webHostEnvironment;

    public YourController (IWebHostEnvironment webHostEnvironment)
    {
        _webHostEnvironment= webHostEnvironment;
    }

    public IActionResult Index()
    {
        string webRootPath = _webHostEnvironment.WebRootPath;
        string contentRootPath = _webHostEnvironment.ContentRootPath;

        string path ="";
        path = Path.Combine(webRootPath , "CSS");
        //or path = Path.Combine(contentRootPath , "wwwroot" ,"CSS" );
        return View();
    }
}

몇 가지 요령

또한 컨트롤러나 서비스가 없는 경우에는 마지막 파트를 따라 해당 클래스를 싱글톤으로 등록합니다.그러면.Startup.ConfigureServices:

services.AddSingleton<your_class_Name>();

마지막으로 주입your_class_Name당신이 필요한 곳에.


.NET 코어 2

예를 들어 찾고자 하는 경우~/wwwroot/CSS

public class YourController : Controller
{
    private readonly IHostingEnvironment _HostEnvironment; //diference is here : IHostingEnvironment  vs I*Web*HostEnvironment 

    public YourController (IHostingEnvironment HostEnvironment)
    {
        _HostEnvironment= HostEnvironment;
    }

    public ActionResult Index()
    {
        string webRootPath = _HostEnvironment.WebRootPath;
        string contentRootPath = _HostEnvironment.ContentRootPath;

        string path ="";
        path = Path.Combine(webRootPath , "CSS");
        //or path = Path.Combine(contentRootPath , "wwwroot" ,"CSS" );
        return View();
    }
}

추가 세부 정보

@Ashin 덕분에 하지만.IHostingEnvironmentMVC Core 3에서 더 이상 사용되지 않습니다!!

이에 따르면:

사용되지 않는 유형(경고):

Microsoft.Extensions.Hosting.IHostingEnvironment
Microsoft.AspNetCore.Hosting.IHostingEnvironment
Microsoft.Extensions.Hosting.IApplicationLifetime
Microsoft.AspNetCore.Hosting.IApplicationLifetime
Microsoft.Extensions.Hosting.EnvironmentName
Microsoft.AspNetCore.Hosting.EnvironmentName

새 유형:

Microsoft.Extensions.Hosting.IHostEnvironment
Microsoft.AspNetCore.Hosting.IWebHostEnvironment : IHostEnvironment
Microsoft.Extensions.Hosting.IHostApplicationLifetime
Microsoft.Extensions.Hosting.Environments 

사용해야 합니다.IWebHostEnvironment대신에IHostingEnvironment.

업데이트: IHosting Environment는 더 이상 사용되지 않습니다.아래 업데이트를 참조하십시오.

As.NET Core 2.2 이하에서는 IHosting Environment라는 인터페이스를 사용하여 호스팅 환경을 추상화했습니다.

ContentRootPath 속성을 사용하면 응용 프로그램 컨텐츠 파일에 대한 절대 경로에 액세스할 수 있습니다.

웹 서비스 가능 루트 경로(기본적으로 www 폴더)에 액세스하려면 WebRootPath 속성을 사용할 수도 있습니다.

이 종속성을 컨트롤러에 주입하고 다음과 같이 액세스할 수 있습니다.

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);
        }
    }

업데이트 - .NET CORE 3.0 이상

IHosting Environment는 @amir133에서 지적한 대로 .NET Core 3.0에서 사용되지 않는 것으로 표시되었습니다.IHosting Environment 대신 IWebHostEnvironment를 사용해야 합니다.아래의 답변을 참고하시기 바랍니다.

Microsoft는 이러한 인터페이스 간에 호스트 환경 속성을 깔끔하게 분리했습니다.아래의 인터페이스 정의를 참조하십시오.

namespace Microsoft.Extensions.Hosting
{
  public interface IHostEnvironment
  {
    string EnvironmentName { get; set; }
    string ApplicationName { get; set; }
    string ContentRootPath { get; set; }
    IFileProvider ContentRootFileProvider { get; set; }
  }
}

namespace Microsoft.AspNetCore.Hosting
{
  public interface IWebHostEnvironment : IHostEnvironment
  {
    string WebRootPath { get; set; }
    IFileProvider WebRootFileProvider { get; set; }
  }
}

승인된 답변의 제안은 대부분의 시나리오에서 충분하지만 - 종속성 주입에 의존하기 때문에 - 컨트롤러 및 보기로 제한됩니다: 적절한 답변을 얻으려면Server.MapPath비싱글톤 도우미 클래스에서 액세스할 수 있는 대체품 우리는 다음 코드 줄을 끝에 추가할 수 있습니다.Configure()앱의 방법Startup.cs파일:

// setup app's root folders
AppDomain.CurrentDomain.SetData("ContentRootPath", env.ContentRootPath);
AppDomain.CurrentDomain.SetData("WebRootPath", env.WebRootPath);

이렇게 하면 다음과 같은 방법으로 모든 클래스(컨트롤러 및 보기를 포함하지만 이에 제한되지 않음)에서 검색할 수 있습니다.

var contentRootPath = (string)AppDomain.CurrentDomain.GetData("ContentRootPath");
var webRootPath = (string)AppDomain.CurrentDomain.GetData("WebRootPath");

이를 통해 기존 모델과 동일한 기능을 사용할 수 있는 정적 도우미 방법을 개발할 수 있습니다.Server.MapPath:

public static class MyServer 
{
    public static string MapPath(string path)
    {
        return Path.Combine(
            (string)AppDomain.CurrentDomain.GetData("ContentRootPath"), 
            path);
    }
}

다음과 같은 방법으로 사용할 수 있습니다.

var docPath = MyServer.MapPath("App_Data/docs");

이 접근 방식과 약간의 배경에 대한 추가 정보를 보려면 제 블로그에 있는게시물을 보십시오.

예:var fullPath = Path.Combine(Directory.GetCurrentDirectory(), "appsettings.json");

언급URL : https://stackoverflow.com/questions/49398965/what-is-the-equivalent-of-server-mappath-in-asp-net-core

반응형