IIS 8.5 ASP.NET Web Api 2 404的路由,除非它们存在于文件系统上

问题描述:

我有一个站点在本地和另外两台服务器上运行(serverA,serverB)。我在本地运行IIS 10,在另外两台服务器上运行IIS 8.5IIS 8.5 ASP.NET Web Api 2 404的路由,除非它们存在于文件系统上

请求Web Api 2路由(通过属性路由定义)在本地站点和serverA上正确处理,但不在serverB上处理。

当向Web Api 2路由发出请求但其他页面正确服务时,我总是从服务器获得404响应。

我发现如果我添加文件夹到我的网站根目录匹配请求url并在最终文件夹中添加index.html Web Api 2路由请求被正确处理并返回有效响应。

实施例: 通常的GET domain.com/api/values一个请求返回404上serverBserverA一个{ value1: "1", value2: "2" }

serverB如果我的网站位于c:\site,我保证c:\site\api\values\index.html存在(即使index.html为空)则GET domain.com/api/values将返回{ value1: "1", value2: "2" }

我认为在一台服务器上配置了扩展路由或请求处理程序,但在比较三台服务器上的站点的web.config时,我还没有弄清楚问题/区别是什么。

我从来没有见过这种行为。

这里是我的serverBweb.config -> system.webServer部分

<system.webServer> 
    <modules runAllManagedModulesForAllRequests="true"> 
     <remove name="WebDAVModule" /> 
     <remove name="XHtmlModule" /> 
     <add name="Glimpse" type="Glimpse.AspNet.HttpModule, Glimpse.AspNet" preCondition="integratedMode" /> 
    </modules> 
    <handlers> 
     <remove name="ExtensionlessUrlHandler-Integrated-4.0" /> 
     <remove name="ExtensionlessUrlHandler-ISAPI-4.0_32bit" /> 
     <remove name="ExtensionlessUrlHandler-ISAPI-4.0_64bit" /> 
     <remove name="UrlRoutingHandler" /> 
     <remove name="WebDAV" /> 
     <remove name="ChartImageHandler" /> 
     <add name="ChartImageHandler" preCondition="integratedMode" verb="*" path="ChartImg.axd" type="System.Web.UI.DataVisualization.Charting.ChartHttpHandler, System.Web.DataVisualization, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" /> 
     <add name="Glimpse" path="glimpse.axd" verb="GET" type="Glimpse.AspNet.HttpHandler, Glimpse.AspNet" preCondition="integratedMode" /> 
     <add name="ExtensionlessUrlHandler-ISAPI-4.0_64bit" path="*." verb="GET,HEAD,POST,DEBUG,PUT,OPTIONS,DELETE" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework64\v4.0.30319\aspnet_isapi.dll" resourceType="Unspecified" requireAccess="Script" preCondition="classicMode,runtimeVersionv4.0,bitness64" responseBufferLimit="0" /> 
     <add name="ExtensionlessUrlHandler-ISAPI-4.0_32bit" path="*." verb="GET,HEAD,POST,DEBUG,PUT,OPTIONS,DELETE" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework\v4.0.30319\aspnet_isapi.dll" resourceType="Unspecified" requireAccess="Script" preCondition="classicMode,runtimeVersionv4.0,bitness32" responseBufferLimit="0" /> 
     <add name="ExtensionlessUrlHandler-Integrated-4.0" path="*." verb="GET,HEAD,POST,DEBUG,PUT,OPTIONS,DELETE" type="System.Web.Handlers.TransferRequestHandler" resourceType="Unspecified" requireAccess="Script" preCondition="integratedMode,runtimeVersionv4.0" responseBufferLimit="0" /> 
    </handlers> 
</system.webServer> 

什么能配置错误,将防止IIS除非文件存在于文件系统,在该请求的路径服务请求?

问题是由于服务器级别的IIS配置更改导致Let's Encrypt正常工作。

我的工作是使用Let's Encrypt允许我们对站点的内部使用的域别名使用有效的证书,因此我们不必为证书付费。

一个网站的/.well-known/acme-challenge/子目录中服务extensionless static files的常见问题的解决方案是Move the StaticFile mapping above the ExtensionlessUrlHandler mappings

看起来问题是,当应用这个时,静态文件在Extensionless Urls和IIS在Web Api路径路径中查找没有扩展名的文件之前处理,并且只在稍后的模块发现了什么他们正在寻找。

我还没弄清楚如何让IIS的加密和ExtensionlessUrlHandler共存,但我会更新这个答案,如果我这样做。