【问题标题】:Creating a folder with the same name as a controller results in 404 - Web API 2创建与控制器同名的文件夹会导致 404 - Web API 2
【发布时间】:2017-01-24 21:27:45
【问题描述】:

如果创建一个与控制器具有相同名称/路由的根级文件夹,IIS 似乎会尝试路由到该文件夹​​,而不是参考 WebAPI 2 路由。

示例:

ProjectA
|- Controllers/
|-- ExamplesController.cs
|- Examples/

ExamplesController

[RoutePrefix("examples")]
public class ExamplesController : ApiController
{
   [HttpGet]
   [Route("")]
   public async Task<IHttpActionResult> Get()
   {
    // code
   }
}

预期是命中控制器,但 IIS 似乎尝试浏览文件夹。

例如:http://localhost:123/examples

尝试的解决方案:

我尝试过使用 IIS 处理程序,看看是否可以删除所有其他处理程序,但这没有帮助

Web.config

<system.webServer>
  <modules>
    <remove name="WebDAVModule" />
  </modules>
  <handlers>
    <clear/>
    <add name="ExtensionlessUrlHandler-Integrated-4.0" path="*." verb="*" type="System.Web.Handlers.TransferRequestHandler" preCondition="integratedMode,runtimeVersionv4.0" />
  </handlers>
</system.webServer>

【问题讨论】:

    标签: asp.net iis asp.net-web-api2


    【解决方案1】:

    路由系统检查文件系统以查看 URL 是否与磁盘上的文件/文件夹匹配。如果找到匹配项,则忽略路由并且请求绕过任何路由条目,以便直接提供文件。这样就可以在不经过 MVC 路由的情况下提供静态文件

    要更改此行为,您可以在 RouteConfig 中将 RouteExistingFiles 属性设置为 true,但这可能会影响您的静态文件,因此请彻底测试它们

    routes.RouteExistingFiles = true;
    

    【讨论】:

    • 完美,会试一试,如果它确实像描述的那样工作,则将其标记为答案
    • 你试过了吗?有什么问题吗?
    • 这按预期工作,但这只是因为我们不从我们的 API 提供任何静态内容。如果您需要同时提供无扩展路由和静态内容,则可能会变得更加棘手。
    猜你喜欢
    • 2016-11-05
    • 1970-01-01
    • 2021-04-21
    • 1970-01-01
    • 1970-01-01
    • 2023-03-24
    • 1970-01-01
    • 2016-05-28
    • 1970-01-01
    相关资源
    最近更新 更多