ASP.NET Web API尝试提供物理目录而不是映射控制器

时间:2017-11-17 11:40:36

标签: c# asp.net iis asp.net-web-api2 iis-express

我有一个先前在路由前缀/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应仅提供来自控制器的动态生成内容。

1 个答案:

答案 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>
...