增加 asp.net 核心中的最大 url 长度

Posted

技术标签:

【中文标题】增加 asp.net 核心中的最大 url 长度【英文标题】:Increase max url length in asp.net core 【发布时间】:2017-07-03 17:59:44 【问题描述】:

我有一个 asp.net core web api,可以启用 tts 请求。你基本上是请求http://server.url/Whatever you want it to say.mp3 得到一个 mp3,其中包含 tts 中的文本。

但问题是,如果我将一个长字符串传递给它,它将返回一个400 - The request URL is invalid。似乎服务器正在达到某种最大 URL 长度限制。我可以找到有关如何解决此问题的信息,即“经典”asp.net web.config,但不是如何在 asp.net 核心中解决此问题。

在 asp.net core 中增加最大 URL 长度的正确方法是什么?

更新:

具体的网址例如:

http://localhost:5000/api/mp3/nl-NL/male/1/Wikipedia%20is%20een%20online%20encyclopedie%20die%20tracht%20inhoud%20te%20bieden%20die%20vrij%20herbruikbaar,%20objectief%20en%20verifieerbaar%20is.%20Het%20project%20is%20gebouwd%20op%20vijf%20zuilen.%20De%20Nederlandstalige%20versie%20startte%20op%2019%20juni%202001%20en%20is,%20gemeten%20naar%20het%20aantal%20artikelen,%20met%20bijna%201,9%20miljoen%20artikelen%20de%20op%20vier%20na%20grootste%20taalversie.mp3

它是 URL 编码的。我会尝试找出确切的最大值是多少。

我不能使用 POST,因为要使用它的工具仅支持 mp3 文件的 url(因此我的控制器中使用了 .mp3 扩展名)。

更新 2

它接受的最长请求有 397 个字符,这看起来不太合乎逻辑。如果我再添加一个,它将返回一个代码 400。

更新 3

事实证明,只有在服务器上部署(使用 IIS)时才会出现这个问题,在本地运行时,它支持更长的字符串(我还没有看到它返回代码 400)。我将不得不查看 IIS 以了解它出错的地方。

【问题讨论】:

您使用的具体网址是什么? 你可以使用 POST 而不是 GET。 崩溃时到底有多大(多字符)?您是否尝试对您的网址进行 url_encoding(空格 => %20+)? 【参考方案1】:

接受的解决方案对我不起作用。我在本地的 iis express 上运行 asp.net core 2.0。有效的是在 startup.cs 中“直接”配置 Kestrel。我不需要更改注册表或重新启动机器。

 var host = new WebHostBuilder()
          .UseKestrel(options => 
              options.Limits.MaxRequestBufferSize = 302768;
              options.Limits.MaxRequestLineSize = 302768;
          )

我在 web.config 中添加了以下内容(尽管我不确定它是否有所作为。)

<requestLimits maxAllowedContentLength="1073741824" maxUrl="20480" maxQueryString="20480" />

这是我找到它的地方:https://titanwolf.org/Network/Articles/Article?AID=2fa1aad6-6b3d-479e-9770-a0850497d270

【讨论】:

在asp.net核心解决方案中哪里可以找到web.config文件?【参考方案2】:

事实证明,我需要做两件事来解决这个问题:

更改 web.config

我需要将以下内容添加到 web.config 以指示 IIS 允许更长的 URL:

<system.webServer>
    <security>
        <requestFiltering allowDoubleEscaping="false">
            <requestLimits maxAllowedContentLength="30000000" maxUrl="40960" maxQueryString="20480" />
        </requestFiltering>
    </security>
</system.webServer>

编辑注册表

在此之后,IIS 仍然会抛出代码 400,因为 UrlSegment 长度太长。可悲的是,改变这种情况的唯一方法是通过一些小的注册表黑客攻击。

导航到HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\HTTP\Parameters 并找到键UrlSegmentMaxLength。如果它不存在,请创建一个值为 REG_DWORD 的值类型。我使用 1000 HEX (4096 DEC) 作为值。如果密钥尚不存在,则默认值为 260。

在更改生效之前,我需要重新启动服务器。

【讨论】:

我一直在努力解决这个问题,直到我看到您的最后一条评论:“我需要重新启动服务器。”我很困惑重启 IIS 还不够。

以上是关于增加 asp.net 核心中的最大 url 长度的主要内容,如果未能解决你的问题,请参考以下文章

增加 Azure 网站中的最大 URL 长度?

签名证书 jwt asp.net 核心中的密钥长度应该是多少

ASP.Net 多行文本框最大长度

重定向到 ASP.net 核心中的 url

ASP.NET Web 服务最大数组长度配额

是否可以增加 HttpClient 中的最大 URL 长度? (无效的 URI:uri 字符串太长)