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で特別な意味を持つフォルダーに配置しないでください。

あなたは持っている可能性があり~/Static、あなたのHTMLファイルを置くことができるフォルダを。そして、そのようにそれにアクセスします:

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

4
または、フォルダーに「静的」という名前を付ける代わりに、Viewsフォルダー内にあるコントローラー名の構造を模倣できます。これにより、URLは同じ「外観」になります。たとえば、プレーンジャインのEdit.htmlをViews / Order / Edit.htmlに配置できないため、〜/ Order / Edit.htmlに配置します
bkwdesign

2
これは、最新のASP.NET(vNext)で変更されました。htmlファイルの静的プロバイダーを登録するだけでなく、通常のMVC方法でもルーティングできます。それですぐに遊んだだけでしたが、それは私がテストプロジェクトでやったことです。Linuxでkestrelを実行していますが、IISは私が想定しているものと同じでなければなりません。
Piotr Kula、2015年

1
@bkwdesignコントローラのデフォルトハンドラをめちゃくちゃにしてアクセス不能にしたフォルダ構造を模倣することで、その構成が制御されていると確信しています。この状況をテストしてください。
Hunter-Orionnoir 2015

78

jsやhtmlなどのファイルをViewsフォルダーで許可するには、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で
サムSippe

マークされた回答には有用な情報が含まれていますが、これがより良い回答です。テスト済みで、現在のプロジェクトで作業しています。
A.マレー

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 14

1
@pwdst:サーバー側のビューを組み合わせて使用​​している場合は、はい、個々のタイプをホワイトリストに登録した方がよい場合があります。.cshtmlファイルを保護したいだけなので、少し冗長ではないのでこれを使用しました。
Vikas 2014

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コアに移行するユーザーに役立つ場合があります。ファイルをビューフォルダではなくwwwrootに配置すると、htmlページにlocalhost / myfile.htmlとして簡単にアクセスできるようになります。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.