私有 NuGet 服务器:请求实体太大
Posted
技术标签:
【中文标题】私有 NuGet 服务器:请求实体太大【英文标题】:Private NuGet Server: Request Entity Too Large 【发布时间】:2012-07-01 04:03:28 【问题描述】:我们有一个内部 NuGet 服务器(使用 NuGet.Server 包的 ASP.net 应用程序),我们希望将它与 Octopus 一起使用来部署包。所以你遇到的第一件事就是包太大了。
当您推送大于 7 Meg 左右的包裹时,您会得到: 处理请求失败。 '请求的实体太大'。 远程服务器返回错误:(413) Request Entity Too Large..
根据 Octopus 上的文档,我更新了 web.config 文件以进行更改。
<configuration>
<configSections>
<sectionGroup name="elmah">
<section name="security" requirePermission="false" type="Elmah.SecuritySectionHandler, Elmah"/>
<section name="errorLog" requirePermission="false" type="Elmah.ErrorLogSectionHandler, Elmah"/>
<section name="errorMail" requirePermission="false" type="Elmah.ErrorMailSectionHandler, Elmah"/>
<section name="errorFilter" requirePermission="false" type="Elmah.ErrorFilterSectionHandler, Elmah"/>
</sectionGroup>
</configSections>
<system.web>
<compilation debug="true" targetFramework="4.0"/>
<httpModules>
<add name="ErrorLog" type="Elmah.ErrorLogModule, Elmah"/>
<add name="ErrorMail" type="Elmah.ErrorMailModule, Elmah"/>
<add name="ErrorFilter" type="Elmah.ErrorFilterModule, Elmah"/>
</httpModules>
<httpRuntime maxRequestLength="419430400" executionTimeout="3600"/>
</system.web>
<system.webServer>
<validation validateIntegratedModeConfiguration="false"/>
<modules runAllManagedModulesForAllRequests="true">
<add name="ErrorLog" type="Elmah.ErrorLogModule, Elmah" preCondition="managedHandler"/>
<add name="ErrorMail" type="Elmah.ErrorMailModule, Elmah" preCondition="managedHandler"/>
<add name="ErrorFilter" type="Elmah.ErrorFilterModule, Elmah" preCondition="managedHandler"/>
</modules>
<staticContent>
<mimeMap fileExtension=".nupkg" mimeType="application/zip"/>
</staticContent>
<security>
<requestFiltering>
<requestLimits maxAllowedContentLength="419430400"/>
</requestFiltering>
</security>
</system.webServer>
<elmah>
<security allowRemoteAccess="false"/>
<errorLog type="Elmah.XmlFileErrorLog, Elmah" logPath="~/App_Data"/>
</elmah>
<location path="elmah.axd" inheritInChildApplications="false">
<system.web>
<httpHandlers>
<add verb="POST,GET,HEAD" path="elmah.axd" type="Elmah.ErrorLogPageFactory, Elmah"/>
</httpHandlers>
</system.web>
<system.webServer>
<handlers>
<add name="ELMAH" verb="POST,GET,HEAD" path="elmah.axd" type="Elmah.ErrorLogPageFactory, Elmah" preCondition="integratedMode"/>
</handlers>
</system.webServer>
</location>
<appSettings>
<add key="apiKey" value="KeyHere"/>
<add key="packagesPath" value=""/>
</appSettings>
<system.serviceModel>
<serviceHostingEnvironment aspNetCompatibilityEnabled="true"/>
</system.serviceModel>
</configuration>
那行不通。其他帖子谈论运行(IIS7)之类的东西: appcmd.exe 设置配置-section:system.webServer/serverRuntime /uploadReadAheadSize:"419430400" /commit:apphost
或 (IIS6): cscript adsutil.vbs 设置 w3svc/1/uploadreadaheadsize 419430400
我都试过了,都没有用。这两个命令都没有返回错误,所以我假设值“419430400”对于所有调用都是正确的(字节与其他一些大小单位)。
有人知道我错过了什么吗?
我最终只是将包复制到网络服务器上的共享位置,但我真的希望 push 命令能够正常工作。
谢谢。
【问题讨论】:
我也完成了与@Tyrel 相同的步骤,并且达到了相同的目的,手动将包放入文件夹中。我希望我的构建服务器能够将包推送到另一台机器上的 NuGet 服务器。我还没有看到这个问题的明确答案。 【参考方案1】:不完全回答 OP 的问题,但与主题相关,我在使用 NuGet push
推送到本地 SymbolSource 服务器时收到 (413) Request Entity Too Large
错误 - 结果我提交到一个稍微不正确的 URL,一旦我更正了命令以指向基本的/NuGet/
URL,它运行得很好。
不知道为什么不正确的 URL 会导致 413 错误,但是你去吧。希望这可以帮助某人。
编辑:根据下面的 cmets,您可能更幸运只是引用基本的 http://www.myserver.com/
URL 而不是包括 /NuGet。值得玩一下。
【讨论】:
它帮助了我!我也收到了错误的 URL 错误。谢谢! 就我而言,我必须删除/NuGet
并只保留基本 URL:http://localhost:56211
和 stack247 一样,它只有在我删除了最后的 nuget/ 部分时才起作用,所以它应该是这样的:nuget.internalserver.com/NuGetServer 而不是 nuget.internalserver.com/NuGetServer/nuget
NB:这真的很痛苦,因为 Visual Studio(至少 2013 年)需要 /nuget 后缀。这使得很难/不可能使用 nuget.exe 并在 -source 参数中使用配置的别名(例如“teamcity”而不是“http://myteamcityserver:someport/some/other/guff”)。
啊。终于开工了。 list/restore 和 push 所需的 URL 不一致,这是所有混乱的根源。请参阅下面的答案。【参考方案2】:
我知道这是一个老问题,但今天我遇到了同样的错误。值得注意的是,我正在使用TeamCity
包构建和发布。无论如何,当我尝试Publish
我的大包(大约 200 MB)时,我被阻止了。解决方法很简单:
不要发布到http://mynugetserver/api/v2/
,使用: http://mynugetserver/
【讨论】:
【参考方案3】:您必须将这些人设置为更高的值:
system.web - httpRuntime - maxRequestLength 到,比如说,1048576 system.webserver-安全-requestFiltering-requestLimits- maxAllowedContentLength 到,比如说 1073741824两个值的单位不同,所以第二个应该大于第一个。
另外,请查看 www.myget.org,我在使用 Octopus Deploy 时发现它非常棒。
【讨论】:
Tyrel 已经为 httpRuntime 上的 maxRequestLength 设置了 419430400。那应该是绰绰有余了。我在使用 120KB 的包时遇到了同样的错误。【参考方案4】:检查您的 serverRuntime
配置。
maxRequestEntityAllowed
和 uploadReadAheadSize
属性分别配置请求的实体正文中允许的最大字节数以及 Web 服务器将读入缓冲区并传递给 ISAPI 扩展的字节数限制。
更多详情:http://www.iis.net/configreference/system.webserver/serverruntime
我猜你正在使用SSL
并设置uploadReadAheadSize
将解决这个问题。因为在客户端重新协商过程中,请求实体主体必须使用 SSL preload 进行预加载。 SSL 预加载将使用 uploadReadAheadSize
属性的值,该属性用于 ISAPI 扩展。
这是默认值
<location path="Default Web Site">
<system.webServer>
<serverRuntime enabled="true"
uploadReadAheadSize="49152"
maxRequestEntityAllowed="4294967295" />
</system.webServer>
</location>
【讨论】:
【参考方案5】:根据@Keith 和@Nubigetter 的回答,我做了一些进一步的研究,因为我觉得这种行为真的很奇怪。
答案实际上在 Nuget.Server 的 documentation 中(如果你仔细观察非常),只是不是很明显:
使用http://mynugetserver/nuget 进行列表/恢复 使用http://mynugetserver/进行推送我已在 https://github.com/NuGet/NuGetGallery/issues/2903 向 Nuget 团队提出此问题,因为我认为这种行为是“提供改进的机会”。
【讨论】:
【参考方案6】:我遇到了同样的问题:
[Step 1/2] Publishing package to feed at http://localhost/OctopusDeploy/nuget/packages...
[Step 1/2] Failed to push to package feed at 'http://localhost/OctopusDeploy/nuget/packages/'.
[Step 1/2] (The server responded with: [413] Request Entity Too Large)
[Step 1/2] Process exited with code 1
但那是因为 Octopus Deploy 服务停止了!
【讨论】:
【参考方案7】:这是由于 nginx 的限制,Linux 系统中的 nuget 服务器使用 nginx 作为代理,配置文件位于:
/etc/nginx/conf.d/nuget.conf
server_name localhost;
root /var/www/public/;
client_max_body_size 200M;
更改 client_max_body_size 200M 对我有用。
【讨论】:
【参考方案8】:这篇文章对我有用:
http://blogs.blackmarble.co.uk/blogs/rfennell/post/2012/10/31/403-and-413-errors-when-publishing-to-a-local-Nuget-Server.aspx
“重要提示:第二个错误是一个红鲱鱼,您不需要在 URL 末尾添加 /nuget”
【讨论】:
推送包时不需要URL末尾的/nuget。您在检索它们时做(nuget 列表等...)。这是在 doco 里,但是……哎呀。让每个人都感到困惑的方式。以上是关于私有 NuGet 服务器:请求实体太大的主要内容,如果未能解决你的问题,请参考以下文章