问题描述
我有带有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)
{
}