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


92

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

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

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

내가 무엇을 놓쳤습니까?

답변:


111

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

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

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

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

4
또는 폴더 이름을 '정적'으로 지정하는 대신 Views 폴더 내부에있는 컨트롤러 이름 구조를 모방 할 수 있습니다. 따라서 URL은 동일한 '모양'을 갖습니다. 예를 들어 , Views / Order / Edit.html 에 plainjane Edit.html 을 넣을 수 없으므로 ~ / Order / Edit.html에 넣습니다
bkwdesign

2
이것은 이제 html 파일에 대한 정적 공급자를 등록 할 수있는 최신 ASP.NET (vNext)에서 변경되었지만 여전히 일반 MVC 방식으로 라우팅됩니다. 빨리 놀았지만 테스트 프로젝트에서 그랬습니다. Linux에서 kestrel을 통해 실행하지만 IIS는 내가 생각하는 것과 동일해야합니다.
Piotr Kula

1
@bkwdesign 폴더 구조를 모방하여 제어되는 구성이 컨트롤러의 기본 처리기를 엉망으로 만들고 액세스 할 수 없게 만들었다 고 확신합니다. 따라서이 상황을 테스트하십시오.
Hunter-Orionnoir 2015

78

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>


1
"routes.RouteExistingFiles = true;"줄을 제거해야했습니다. 이 작동하도록 RouteConfig.RegisterRoutes에서
Sam Sippe

표시된 답변에 유용한 정보가 포함되어 있지만 이것이 더 나은 답변입니다. 내 현재 프로젝트에서 테스트하고 작업했습니다.
A. Murray

1
CSS 파일은 어떻습니까?
Leandro

@Darin 디미트로프의 대답은 해결 방법을 제공하지만,이 대답으로 표시해야한다
쿠날

31

~ / 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" />

3
.aspx 또는 .ascx 파일과 같은 다른 파일이나 타사 뷰 엔진의 파일에서는 여전히 위험 할 수 있습니다. cs3x의 답변에 따라 화이트리스트에 훨씬 더 좋습니다.
pwdst

1
@pwdst : 서버 측 뷰를 혼합하여 사용하는 경우 개별 유형을 허용하는 것이 더 좋을 수 있습니다. 우리는 .cshtml 파일을 보호하고 싶기 때문에 좀 덜 장황하기 때문에 이것을 사용했습니다.
Vikas 2015

14

또 다른 대안은 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;
 }

0

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

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.