我的Azure Web应用程序中有以下HTML:
Please complete and return the
<a href="~/Views/MyView/TermsOfService.pdf">Terms of Service</a>
.csproj文件中包含此pdf:
当我点击&#34;启动Google Chrome&#34;在Visual Studio中本地测试,当我点击&#34;服务条款&#34;时,我收到以下错误:
但文件就在那里!它在我的文件系统上。没有必要的编码。为什么显示此错误以及为什么无法从Web应用程序下载PDF?我是否需要另一步来发布它?请帮忙!
答案 0 :(得分:3)
默认情况下,普通请求管道不应访问 Views
文件夹的内容。 Views
文件夹是视图文件(.cshtml
)的主页,它将由视图引擎执行。如果查看位于~/Views
内的web.config文件,您可以看到我们注册了BlockViewHandler
,这会阻止对所有文件的直接文件访问。
<handlers>
<remove name="BlockViewHandler"/>
<add name="BlockViewHandler" path="*" verb="*" preCondition="integratedMode"
type="System.Web.HttpNotFoundHandler" />
</handlers>
您应该考虑将您的pdf文件移动到应用程序根目录中的Statics
目录并指向该目录。
现在,指向该位置
<a href="~/Statics/TermsOfService.pdf">Terms of Service</a>
您可以为目录指定自己的名称。有些人喜欢将它保存在Content
目录下。所以这更像是个人偏好。
在asp.net核心中,wwwroot
目录默认为静态内容主目录。所以你可以将静态内容保存在其中(这是可以覆盖的)
您可以对位于views
目录中的web.config进行更改以允许直接浏览,但更扎实的方法是不污染约定并将静态资源移动到它自己的文件夹。如果您绝对希望启用对视图目录的直接文件访问,则可以更新path
属性值以告知mvc以防止仅访问具有特定扩展名的文件。以下是如何仅阻止.cshtml
个文件(因此pdf将起作用)
<handlers>
<remove name="BlockViewHandler"/>
<add name="BlockViewHandler" path="*.cshtml" verb="*" preCondition="integratedMode"
type="System.Web.HttpNotFoundHandler" />
</handlers>