允许在 IIS/Azure 中的 ASP.NET Core 的 URL 中使用冒号 (:)

Hay*_*fee 3 asp.net iis azure asp.net-core

我有一个正在部署到 Azure 的 ASP.NET Core 应用程序,该应用程序在 URL 中接收包含冒号(时间戳)的字符串。

例如:http://localhost:5000/Servers/208.100.45.135/28000/2017-03-15T07:03:43+00:00,或http://localhost:5000/Servers/208.100.45.135/28000/2017-03-15T07%3a03%3a43%2B00%3a00URL 编码。

使用 Kestrel ( ) 在本地运行时效果非常好dotnet run,但在部署到 Azure 后我收到此错误:The resource you are looking for has been removed, had its name changed, or is temporarily unavailable.

快速搜索发现,这是由于 URL 中使用了无效字符(即冒号)造成的。传统的修复方法是将此部分添加到web.config

 <system.web>
     <httpRuntime requestPathInvalidCharacters="" />
 </system.web>
Run Code Online (Sandbox Code Playgroud)

但是,将其添加到 Azure 上的 web.config 后,我发现没有任何变化。我想这是由于 ASP.NET Core 托管模型的差异造成的。

这是我目前的web.config

<configuration>
    <system.web>
        <httpRuntime requestPathInvalidCharacters=""/>
        <pages validateRequest="false" />
    </system.web>
    <system.webServer>
        <handlers>
        <add name="aspNetCore" path="*" verb="*" modules="AspNetCoreModule" resourceType="Unspecified" />
        </handlers>
        <aspNetCore processPath="dotnet" arguments=".\Server.dll" stdoutLogEnabled="false" stdoutLogFile=".\logs\stdout" forwardWindowsAuthToken="false" />
    </system.webServer>
</configuration>
Run Code Online (Sandbox Code Playgroud)

以及相关的控制器头...

[HttpGet]
[Route("{serverIpAddress}/{serverPort}/{approxMatchStartTimeStr}")]
public IActionResult GetMatchEvents(string serverIpAddress, string serverPort, DateTimeOffset approxMatchStartTimeStr)
{
    ...
}
Run Code Online (Sandbox Code Playgroud)

如何让 IIS/Azure 允许 URL 中使用冒号字符?

hal*_*r73 5

您遇到的问题与路径中的冒号 (:) 无关,实际上是IIS 不喜欢的加号 (+)。加号是否编码为“+”或“%2B”并不重要。您有两个选择:

  1. 将 plus/DateTimeOffset 从路径移至 IIS 不介意的查询字符串。
  2. 将 IIS 请求过滤模块配置为“allowDoubleEscaping”。

示例 web.config:

<?xml version="1.0" encoding="utf-8"?>
<configuration>
    <system.webServer>
        <security>
            <requestFiltering allowDoubleEscaping="true" />
        </security>
        <handlers>
            <add name="aspNetCore" path="*" verb="*" modules="AspNetCoreModule" resourceType="Unspecified" />
        </handlers>
        <aspNetCore processPath="dotnet" arguments=".\Server.dll" stdoutLogEnabled="false" stdoutLogFile=".\logs\stdout" forwardWindowsAuthToken="false" />
    </system.webServer>
</configuration>
Run Code Online (Sandbox Code Playgroud)

当前 web.config 的 system.web 部分与 ASP.NET Core 无关。