Asp.Net MVC:在网址中允许使用“ DEL”字符

问题描述

我有带有Web API控制器的Asp.Net MVC应用程序(.NET Framework 4.8),我需要在其中允许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中,更改了无效字符列表,因为<的值中可以包含>&parameter和其他字符}

<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包含百分比编码的保留字符(例如!,*,:,+等,以及其他类似.的字符时),路由正确工作,并且控制器的动作已达到预期{ 1}}的值(例如,发出请求到URL parameter,并且在控制器的操作中http://localhost/management/012345%2A的值为parameter)。

但是,当012345*包含parameter形式为百分比DEL的{​​{1}}字符时(例如,向URL %7F发出了请求),IIS将返回http://localhost/management/012345%7F >

Bad Request

请问如何在Asp.Net MVC应用程序的URL中允许<!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> 字符?

更新 RFC https://tools.ietf.org/html/rfc3986未将DEL字符指定为保留字符或未保留字符。但是,DEL字符可以是Asp.Net Core应用程序中URL的一部分。不幸的是,由于技术限制,该项目无法移至Asp.Net Core

解决方法

以下是%7F无法使用的示例:(尝试!)

https://stackoverflow.com/%7F

这是%7F可以工作的示例:(尝试!)

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

因此将代码更改为:

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