Asp.Net MVC:允许 URL 中的 `DEL` 字符

Asp.Net MVC: Allow the `DEL` character in URL

我有 Asp.Net MVC 应用程序 (.NET Framework 4.8) 和 Web API 控制器,我需要允许 DEL 字符(ASCII 字符 127,HX是 %7F) 在该控制器的操作参数中。 (一般来说,我需要允许几乎所有从 32 到 127 的 ASCII 字符,但 /\)。

我的控制器

public class ManagementController : ApiController
...
[HttpPost]
[Route("management/{paramater?}")]
public async Task<IHttpActionResult> Post(string paramater = null)
{
}

web.config 中更改了无效字符列表,因为 <>& 和其他字符可以出现在 [= 的值中25=]

<system.web>
  <httpRuntime targetFramework="4.8" requestPathInvalidCharacters="\" />
</system.web>

还允许双重转义以启用加号 +(是的,这被认为是危险的设置)并添加了 ManagementUrlHandler-Integrated-4.0 处理程序以允许 URL.

<system.webServer>
  <security>
    <requestFiltering allowDoubleEscaping="true" />
  </security>
  <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" />
    <add name="ManagementUrlHandler-Integrated-4.0"
         path="/management/*"
         verb="POST"
         type="System.Web.Handlers.TransferRequestHandler"
         preCondition="integratedMode,runtimeVersionv4.0" />
  </handlers>
</system.webServer>

目前,当 parameter 包含百分比编码的保留字符(例如 !、*、:、+ 等以及 . 等其他字符时),路由可以正常工作并且控制器的操作符合预期parameter 值(例如,向 URL http://localhost/management/012345%2A 发出请求,并且 parameter 值在控制器的操作中为 012345*

然而,当 parameter 包含 DEL 百分号编码形式的字符 %7F(例如,向 URL http://localhost/management/012345%7F 发出请求)时,IIS returnsBad Request

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN""http://www.w3.org/TR/html4/strict.dtd">
<HTML>

<HEAD>
    <TITLE>Bad Request</TITLE>
    <META HTTP-EQUIV="Content-Type" Content="text/html; charset=us-ascii">
</HEAD>

<BODY>
    <h2>Bad Request - Invalid URL</h2>
    <hr>
    <p>HTTP Error 400. The request URL is invalid.</p>
</BODY>

</HTML>

请问如何在 Asp.Net MVC 应用程序的 URL 中允许 DEL 字符?

更新 RFC https://www.rfc-editor.org/rfc/rfc3986 没有指定 DEL 字符为保留字符或非保留字符。但是 DEL 字符可以是 Asp.Net 核心应用程序中 URL 的一部分。不幸的是,由于技术限制

,此项目无法移至 Asp.Net Core

这是一个 %7F 不起作用的例子:(试一试!)

https://whosebug.com/%7F

这里是 %7F 起作用的例子:(试一试!)

https://whosebug.com/?parameter=%7F

因此将您的代码更改为:

public class ManagementController : ApiController
...
[HttpPost]
public async Task<IHttpActionResult> Management(string parameter = null)
{
}