私有 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 配置。

maxRequestEntityAlloweduploadReadAheadSize 属性分别配置请求的实体正文中允许的最大字节数以及 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 服务器:请求实体太大的主要内容,如果未能解决你的问题,请参考以下文章

请求实体太大 WCF REST 服务

WCF:远程服务器返回错误:(413)请求实体太大[重复]

响应:413 请求实体太大

远程服务器返回意外响应:(413) 请求实体太大。

(413) 使用 WCF 请求实体太大错误

PHP 413(请求实体太大)