태그 보관물: asp.net-mvc-routing

asp.net-mvc-routing

ASP.NET MVC의 ~ / Views 폴더에서 정적 .html 파일을 어떻게 요청합니까? .html에있는 정적 파일 을

폴더 .html에있는 정적 파일 을 요청할 수 있기를 원합니다 ~/Views. 설명서에 따르면 라우팅 시스템은 응용 프로그램의 경로를 평가하기 전에 URL이 디스크 파일과 일치하는지 확인합니다.

그러나 파일을 요청하면 404오류가 발생합니다.

내 파일은 ~ / Views 폴더에 있습니다. URL은 다음과 같습니다.http://[localhost]/Views/HtmlPage1.html

내가 무엇을 놓쳤습니까?



답변

‘~ / Views’폴더에있는 정적 .html 파일을 요청할 수 있기를 원합니다.

당신은 할 수 없습니다. 이 폴더에는 모든 파일에 대한 액세스를 명시 적으로 금지하는 web.config 파일이 있습니다. 클라이언트에서 파일에 액세스하려면 해당 파일 Views을 ASP.NET MVC에서 특별한 의미가있는 폴더에 두지 않아야합니다 .

~/StaticHTML 파일을 저장할 수 있는 폴더가있을 수 있습니다. 그리고 다음과 같이 액세스하십시오.

http://example.com/yourapplicationname/static/foo.html


답변

Views 폴더에서 js 및 html과 같은 파일을 허용하려면 views-Folder에서 web.config를 편집하십시오.

<system.webServer>
<handlers>
  <add name="JavaScriptHandler" path="*.js" verb="*"
     preCondition="integratedMode" type="System.Web.StaticFileHandler" />
  <add name="HtmlScriptHandler" path="*.html" verb="*"
     preCondition="integratedMode" type="System.Web.StaticFileHandler" />
  <remove name="BlockViewHandler"/>
  <add name="BlockViewHandler" path="*" verb="*" preCondition="integratedMode" type="System.Web.HttpNotFoundHandler" />
</handlers>


답변

~ / Views 폴더에있는 정적 .html 파일을 요청할 수 있기를 원합니다.

당신은 할 수 있습니다. 표시된 답변은 해결책을 제공하지만 완전히 정확하지는 않습니다.

표시된 답변의 이유는 정확합니다. Views 폴더의 web.config (특정 BlockViewHandler 설정)로 인해 파일에 직접 액세스 할 수 없습니다. Asp.Net MVC에서 뷰를 보호하기 위해 있습니다. 그러나 이러한 파일을 직접 제공하는 것에 대한 질문을했다면 이상한 이름으로보기 폴더를 복제하지 않으려는 AngularJS 부분보기 (이 경우)를 사용하는 것과 같은 유효한 이유가있을 수 있습니다.

따라서 asp.net mvc보기의 보안을 손상시키지 않고 Views 폴더에있는 web.config 파일에서 수행 할 수있는 매우 간단한 조정이 있습니다. 이렇게하면 평소와 같이 .cshtml 파일이 보호되지만 .html 파일은 그대로 둡니다.

이것을 변경

<add name="BlockViewHandler" path="*" verb="*" preCondition="integratedMode"    type="System.Web.HttpNotFoundHandler" />

–에–

<add name="BlockViewHandler" path="*.cshtml" verb="*" preCondition="integratedMode" type="System.Web.HttpNotFoundHandler" />


답변

또 다른 대안은 html 파일을 제공하기 위해 원하는 컨트롤러에 액션 메소드를 삽입하는 것입니다.

public ActionResult MyHtml()
{
    var result = new FilePathResult("~/Views/HtmlPage1.html", "text/html");
    return result;
}

http : // yoursite / controller / MyHtml 로 html에 액세스하십시오 . 이 액션 메서드를 확장하여 html 파일 이름을 method / querystrign 매개 변수로 받아들이고 런타임에 파일을 렌더링 할 수 있습니다.

 public ActionResult MyHtml(string htmlPageName)
 {
      var result = new FilePathResult($"~/Views/{htmlPageName}.html", "text/html");
      return result;
 }


답변

내부보기 폴더를 사용하려는 경우 위의 답변이 가장 좋지만이 답변은 asp.net mvc core로 마이그레이션하는 사용자에게 유용 할 수 있습니다. 보기 폴더 대신 wwwroot에 파일을 배치하면 html 페이지가 localhost / myfile.html로 쉽게 액세스 할 수 있습니다.


답변