我有一个先前在路由前缀/api/
(example.com/api/Users
)下提供的现有ASP.NET Web API 2项目,但现在需要直接在根目录下移动({{1} })。
问题是现在某些路由与项目根目录中的物理目录匹配,并且IIS在发出此类冲突请求时会尝试为这些目录提供服务。
这就是项目结构的样子:
example.com/Users
使用属性路由映射路由:MyApi/
App_Start/
Controllers/
Models/
...
Permissions/
...
Global.asax
Global.asax.cs
...
Web.config
这是一个有问题的控制器的简化示例:
config.MapHttpAttributeRoutes();
当向namespace MyApi.Controllers
{
[RoutePrefix("Permissions")]
public class PermissionController
{
[Route("")]
[HttpGet]
[ResponseType(typeof(IEnumerable<Permission>))]
public IHttpActionResult Get()
{
return ...
发出请求时,IIS首先使用example.com/Permissions
重定向到301
(尾随斜杠),然后使用:
example.com/Permissions/
没有冲突的目录名称的所有其他控制器按预期工作。
我已尝试启用和停用IIS 10.0 Detailed Error
HTTP Error 403.14 - Forbidden
The Web server is configured to not list the contents of this directory.
Detailed Error Information:
Module DirectoryListingModule
Notification ExecuteRequestHandler
Handler StaticFile
Error Code 0x00000000
,我尝试添加和删除这样的处理程序:
runAllManagedModulesForAllRequests
我甚至尝试删除<add name="ApiURIs-ISAPI-Integrated-4.0" path="*" type="System.Web.Handlers.TransferRequestHandler" verb="GET,HEAD,POST,DEBUG,PUT,DELETE,PATCH,OPTIONS" preCondition="integratedMode,runtimeVersionv4.0" />
处理程序,但到目前为止我没有尝试过任何工作。
目前这是StaticFile
。它与创建新的空Web API 2项目时默认情况下Visual Studio 2015生成的内容完全相同:
Web.config
那么我可以阻止IIS尝试在项目中提供物理文件吗? API应仅提供来自控制器的动态生成内容。
答案 0 :(得分:2)
经过大量的反复试验,我似乎找到了解决方案。
此标志使API更喜欢控制器而不是目录:
System.Web.Routing.RouteTable.Routes.RouteExistingFiles = true;
Web.config
的更改:
runAllManagedModulesForAllRequests
允许网址(/Users/firstname.lastmane
)StaticFile
处理程序将返回404
个错误而不是403
错误。内容:
...
<system.webServer>
<modules runAllManagedModulesForAllRequests="true" />
<handlers>
<remove name="ExtensionlessUrlHandler-Integrated-4.0" />
<remove name="OPTIONSVerbHandler" />
<remove name="TRACEVerbHandler" />
<remove name="StaticFile" />
<add name="ExtensionlessUrlHandler-Integrated-4.0" path="*." verb="*" type="System.Web.Handlers.TransferRequestHandler" preCondition="integratedMode,runtimeVersionv4.0" />
</handlers>
</system.webServer>
...