首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >我如何告诉IIS使用我的.NET应用程序中的底层catch路由从web根目录中提供静态文件?

我如何告诉IIS使用我的.NET应用程序中的底层catch路由从web根目录中提供静态文件?
EN

Stack Overflow用户
提问于 2015-08-14 16:41:59
回答 3查看 9.7K关注 0票数 5

我有一个用.NET 5 beta-4构建并运行在IIS8.5上的web应用程序。

我想要IIS为所有的静态文件服务,所以我删除了.NET 5静态文件中间件。这通常如预期的那样工作。例如,/img/image.png将通过IIS得到正确的服务。

但是,在我的.NET应用程序中,我有一个可以满足业务需求的全捕获路由("/{param?}")。但是我的webroot文件夹中也有一些需要处理的静态文件(robots.txtfavicon.ico等)。

我遇到的问题是: IIS将web根静态文件请求路由到.NET应用程序,然后运行所有捕获路由,这将导致一个404。理想情况下,我希望IIS在web根目录中找到静态文件时为其提供服务。如果找不到,请将请求发送到.NET catch-all路由。

如何告诉IIS8.5在我的.NET 5应用程序中使用底层的catch路由从web根目录提供静态文件?

EN

回答 3

Stack Overflow用户

发布于 2016-06-02 13:57:28

因为我们使用IIS来服务我们的IISCore1.0(以前称为ASP.NET 5)应用程序,所以我们希望使用IIS压缩和缓存静态文件。

它可以使它更有效率,静态资产不受影响时,您的应用程序回收。无论如何,建议将app.UseStaticFiles();作为尽早放在应用程序的请求管道中,以便使请求短路。但是,有一个IIS服务器可以通过压缩和缓存内置的方式为静态文件提供服务。如果在Linux上,Nginx通常设置为服务静态文件本身,而不触及ASP.NET核心管道。因此,我们希望在IIS上这样做(如果没有,那么为什么要使用IIS?)

为了将IIS配置为提供静态文件而不是我们的ASP.NET核心(Kestrel)服务器,我们将StaticFileModule配置为在AspNetCoreModule处理程序之前运行特定的文件扩展名,因为顺序非常重要。(上述答案中的重写方法无效)。可以有一种更好的方法来定义StaticFileModule处理程序,以服务于www.root中的任何现有文件。我们仍然在应用程序中使用app.UseStaticFiles();来捕获没有在StaticFileModule处理程序中定义的任何模糊的静态文件。

下面是web.config (system.webServer部分):

代码语言:javascript
复制
<system.webServer>
<handlers>
  <add name="StaticFiles_Js" path="*.js" verb="*" modules="StaticFileModule" resourceType="File" requireAccess="Read" />
  <add name="StaticFiles_Css" path="*.css" verb="*" modules="StaticFileModule" resourceType="File" requireAccess="Read" />
  <add name="StaticFiles_Img" path="*.jpg" verb="*" modules="StaticFileModule" resourceType="File" requireAccess="Read" />
  <add name="StaticFiles_Png" path="*.png" verb="*" modules="StaticFileModule" resourceType="File" requireAccess="Read" />
  <add name="StaticFiles_Gif" path="*.gif" verb="*" modules="StaticFileModule" resourceType="File" requireAccess="Read" />
  <add name="StaticFiles_Fnt" path="*.eot" verb="*" modules="StaticFileModule" resourceType="File" requireAccess="Read" />
  <add name="StaticFiles_Ttf" path="*.ttf" verb="*" modules="StaticFileModule" resourceType="File" requireAccess="Read" />
  <add name="StaticFiles_Ico" path="*.ico" verb="*" modules="StaticFileModule" resourceType="File" requireAccess="Read" />
  <add name="StaticFiles_Pdf" path="*.pdf" verb="*" modules="StaticFileModule" resourceType="File" requireAccess="Read" />
  <add name="aspNetCore" path="*" verb="*" modules="AspNetCoreModule" resourceType="Unspecified" />
</handlers>
<aspNetCore processPath="..\MySite.exe" arguments="" stdoutLogEnabled="false" stdoutLogFile="..\logs\stdout" forwardWindowsAuthToken="true" />
<!-- Adding Gzip compression for static files -->
<httpCompression directory="%SystemDrive%\inetpub\temp\IIS Temporary Compressed Files" minFileSizeForComp="1024">
  <scheme name="gzip" dll="%Windir%\system32\inetsrv\gzip.dll" />
  <staticTypes>
    <add mimeType="text/*" enabled="true" />
    <add mimeType="application/javascript" enabled="true" />
    <add mimeType="application/json" enabled="true" />
    <add mimeType="*/*" enabled="false" />
  </staticTypes>
</httpCompression>
</system.webServer>

若要确认IIS用于静态文件/资产,只需使用F12开发人员工具查看响应头。html页面将有响应头,显示它是由.NET应用程序(Server: Kestrel)提供的,但是如果启用压缩,.css或.js资产将具有Server: Microsoft-IISContent-Encoding:gzip

票数 3
EN

Stack Overflow用户

发布于 2015-09-11 15:18:59

虽然我同意使用中间件的想法,但如果您绝对希望依赖您的idea服务器来提供静态文件,而不碰触您的应用程序,您可以设置一个与文件相关的重写:

代码语言:javascript
复制
<rule name="Static Files" stopProcessing="true">
    <match url="(.*)" />
    <conditions logicalGrouping="MatchAny">
        <add input="{APPL_PHYSICAL_PATH}wwwroot\{R:1}" matchType="IsFile" />
    </conditions>
    <action type="Rewrite" url="/{R:1}" />
</rule>

这应该检查您的请求是否是文件系统上的文件,以及它是否正在直接将请求重写并停止处理请求。

票数 2
EN

Stack Overflow用户

发布于 2015-09-22 09:16:47

从IIS 5 Beta 7开始,您现在可以返回到ASP.NET,使用以下一行处理静态文件:

代码语言:javascript
复制
public void Configure(
    IApplicationBuilder app, 
    IHostingEnvironment env, 
    ILoggerFactory loggerFactory)
{
    // ...Omitted

    // Enable the IIS native module to run after the ASP.NET middleware components.
    // This call should be placed at the end of your Startup.Configure method so that
    // it doesn't interfere with other middleware functionality.
    app.RunIISPipeline();
}

有关更多细节,请参见下面的正式文件

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32014912

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档