IIS 8.5 ASP.NET Web Api 2 404的路由,除非它们存在于文件系统上
我有一个站点在本地和另外两台服务器上运行(serverA
,serverB
)。我在本地运行IIS 10
,在另外两台服务器上运行IIS 8.5
。IIS 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上serverB
和serverA
一个{ 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
时,我还没有弄清楚问题/区别是什么。
我从来没有见过这种行为。
这里是我的serverB
web.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共存,但我会更新这个答案,如果我这样做。