在ASP.NET Core中增加最大URL长度

10
我有一个asp.net core web api,可以进行tts请求。您可以请求http://server.url/您想要说的任何内容.mp3来获取以tts朗读文本的mp3文件。

但问题在于,如果我传递一个很长的字符串,它将返回400-请求URL无效。似乎服务器命中了某种最大URL长度限制。我可以找到如何在"classic" asp.net web.config中解决此问题的信息,但不知道如何在asp.net core中解决此问题。

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

更新:

确切的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,看看出了什么问题。

你使用的确切URL是什么? - koelkastfilosoof
2
你可以使用POST而不是GET。 - juunas
它崩溃时有多大(多少个字符)?你尝试过对你的URL进行编码(空格=>%20+)吗? - Joel Harkes
2个回答

17

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

更改 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 的键。我使用1000HEX(4096DEC)作为该键的值。如果该键还不存在,则默认值为260。

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


1
我一直在苦苦挣扎,直到看到你的最后一条评论:“我需要重新启动服务器。”我很困惑重启IIS为什么不够。 - Guillermo Prandi
刚刚添加了 web.config 部分,在 .net core 3.1 中对我有效。 - Ahmad Ahsan

4

对我来说,已接受的解决方案不起作用。 我在本地使用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

1
在 asp.net core 解决方案中,我应该在哪里找到 web.config 文件? - shivu
@shivu 默认情况下,在新的.Net Core/5/6/7+应用程序中,它是不存在的。它不包含在应用程序模板中。然而,_一些_托管环境,如IIS,至少需要一个最小的web.config文件。您可以手动添加一个。文件内容格式与旧式asp.net web.config文件相同。对于.Net Core应用程序,该文件可以更小;通常只由IIS使用,而不是应用程序本身。 - Zarepheth

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接