gpt4 book ai didi

c# - ASP.NET Web API 尝试提供物理目录而不是映射 Controller

转载 作者:行者123 更新时间:2023-11-30 16:42:05 26 4
gpt4 key购买 nike

我有一个现有的 ASP.NET Web API 2 项目,该项目以前在路由前缀 /api/ (example.com/api/Users) 下提供服务,但现在它需要直接移动到根目录下 (example.com/Users)。

问题是现在一些路由与项目根目录中的物理目录相匹配,并且 IIS 在发出此类冲突请求时尝试为这些目录提供服务。

项目结构如下:

MyApi/
App_Start/
Controllers/
Models/
...
Permissions/
...
Global.asax
Global.asax.cs
...
Web.config

路由使用属性路由映射:config.MapHttpAttributeRoutes();

这是一个有问题的 Controller 的简化示例:

namespace MyApi.Controllers
{
[RoutePrefix("Permissions")]
public class PermissionController
{
[Route("")]
[HttpGet]
[ResponseType(typeof(IEnumerable<Permission>))]
public IHttpActionResult Get()
{
return ...

当向 example.com/Permissions 发出请求时,IIS 首先响应 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

没有冲突目录名称的所有其他 Controller 都按预期工作。

我试过启用和禁用 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.config。它与 Visual Studio 2015 在创建新的空 Web API 2 项目时默认生成的内容相同:

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

那么我可以阻止 IIS 尝试为项目内的物理文件提供服务吗? API 应仅提供来自 Controller 的动态生成的内容。

最佳答案

经过反复试验,我似乎找到了解决办法。

此标志使 API 更喜欢 Controller 而不是目录:

System.Web.Routing.RouteTable.Routes.RouteExistingFiles = true;

Web.config 的更改:

  • runAllManagedModulesForAllRequests 允许在 URL 中使用点 (/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>
...

关于c# - ASP.NET Web API 尝试提供物理目录而不是映射 Controller ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47349842/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com