【问题标题】:WebAPI route with period in final parameter fails最终参数中带有句点的 WebAPI 路由失败
【发布时间】:2015-08-09 09:28:25
【问题描述】:

问题

使用 WebAPI,其中请求中的最终参数包含 句号 / 句号 / '.'

  • 对于像/api/values/dog.cat 这样的“简单”路由,可以路由。
  • 对于像/api/values/mammal/dog.cat 这样更复杂的路由,返回 404

我的问题是如何获得更复杂的工作路线?


背景

以下所有测试均使用从 Visual Studio WebAPI 模板创建的新项目。

我知道我的请求看起来有一个文件扩展名,所以已经设置:

<modules runAllManagedModulesForAllRequests="true">

所以在 StaticFile 处理程序没有找到该项目后,它会将其传递给托管处理程序。

如果我请求 /api/values/mamal/dog.cat/(带有斜杠),这可以正常工作,但不幸的是,我们被 API 合同困住了,我不能这样做。

.NET 版本

当面向 .NET4.0 并使用 Visual Studio WebAPI 模板时,更复杂的路由可以正常工作。

当面向 .NET4.5 时,使用默认 WebAPI 模板,更复杂的路由返回 404。

我们的一些生产代码在 .csproj 文件中以 .NET4.5 为目标,但在 web.config 中有 &lt;compilation targetFramework="4.0"in(并且没有 &lt;httpRuntime&gt; 元素),并且似乎确实可以处理更复杂的路由,在最终参数。

两种情况

使用默认路由:

config.Routes.MapHttpRoute(
    name: "DefaultApi",
    routeTemplate: "api/{controller}/{id}",
    defaults: new { id = RouteParameter.Optional }
);

还有一个对ValuesController 的简单操作:

public string Get(string id)
{
    return string.Format("Param id: '{0}'", id);
}

请求/api/values/dog.cat,然后路由将带您执行操作。

现在更改路由以添加额外的类别参数:

config.Routes.MapHttpRoute(
    name: "DefaultApi",
    routeTemplate: "api/{controller}/{category}/{id}",
    defaults: new { id = RouteParameter.Optional }
);

并修改ValuesController中的端点:

public string Get(string category, string id)
{
    return string.Format("category: {0}, id: {1}", category, id);
}

请求/api/values/mamal/dog.cat,你会得到404 not found

请求/api/values/mamal/dog.cat/并调用该操作。

其他 stackoverflow 问题

stackoverflow 上有各种类似的问题,它们的答案看起来像是解决了这个问题,但实际上并不相关(如果您想将此问题标记为重复问题!)。

例如:

此处理程序仅处理以句点结尾的请求,例如/api/values/dog.cat.,而不处理参数中的句点:

<system.webServer>
  <handlers>
    <remove name="ExtensionlessUrlHandler-Integrated-4.0" />
    <add name="ExtensionlessUrlHandler-Integrated-4.0" path="*." verb="GET,HEAD,POST,DEBUG,PUT,DELETE,PATCH,OPTIONS" type="System.Web.Handlers.TransferRequestHandler" preCondition="integratedMode,runtimeVersionv4.0" />
   </handlers>
</system.webServer> 

此外,以下映射仅关于允许保留字,而不是 URL 中的句点:

<httpRuntime relaxedUrlToFileSystemMapping="true" />

可能的解决方法

可以降级到 .NET4.0,这似乎可行。但不想这样做,因为使用了 async/await 功能。

我大概可以使用 IIS URL Rewrite 模块之类的东西来为缺少它的请求添加一个尾部斜杠,但我宁愿在理解绑定为什么“失败”的基础上找到一个解决方案。

【问题讨论】:

    标签: asp.net-web-api asp.net-web-api-routing


    【解决方案1】:

    通过修改 web.config handlers 部分并在 path 属性中将其从 path="*" 更改来解决此问题。到路径=“*”

    &lt;add name="ExtensionlessUrlHandler-Integrated-4.0" path="*" verb="*" type="System.Web.Handlers.TransferRequestHandler" preCondition="integratedMode,runtimeVersionv4.0" /&gt;

    【讨论】:

    • 这修复了我们 5 个问题案例中的 2 个。 (在最后列出)我们还设置了 不起作用的情况:abcd.- bad abcd.-@ bad abcd-。固定 abcd.@ 坏 abcd-@。固定
    • 这主要是有效的,除了删除请求在这个配置下不起作用。在 webapi 运行之前,我在某个地方得到了 500。
    猜你喜欢
    • 1970-01-01
    • 2017-09-07
    • 2018-12-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-02
    相关资源
    最近更新 更多