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

时间:2017-03-15 20:15:09

标签: asp.net azure iis asp.net-core

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

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

使用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>

但是,在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>

相关的控制器标题......

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

如何让IIS / Azure允许URL中的冒号?

1 个答案:

答案 0 :(得分:4)

您遇到的问题与路径中的冒号(:)无关,它实际上是plus (+) that IIS doesn't like。如果将加号编码为&#34; +&#34;则无关紧要。或&#34;%2B&#34;。您有两种选择:

  1. 将路径中的plus / DateTimeOffset移动到IIS不介意的查询字符串。
  2. 将IIS请求过滤模块配置为&#34; allowDoubleEscaping&#34;。
  3. 示例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>
    

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