Частный сервер NuGet: запрашивать сущность слишком большой
У нас есть внутренний сервер NuGet (приложение ASP.net с использованием пакета NuGet.Server), и мы хотим использовать его с 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 set config -section: system.webServer/serverRuntime/uploadReadAheadSize: "419430400" /commit: apphost
или (IIS6): cscript adsutil.vbs set w3svc/1/uploadreadaheadsize 419430400
Я пробовал обойтись безрезультатно. Ни одна из команд не возвращала ошибку, поэтому я предполагаю, что значение "419430400" верно для всех вызовов (байт по сравнению с некоторой другой единицей размера).
Кто-нибудь знает, что мне не хватает?
Я закончил просто копирование пакета на общий ресурс на веб-сервере, но мне бы очень хотелось, чтобы команда push работала.
Спасибо.
Ответы
Ответ 1
Не совсем отвечающий на вопрос OP, но связанный с этим темой, я получал ошибку (413) Request Entity Too Large
при использовании NuGet push
, чтобы нажать на локальный сервер SymbolSource - оказалось, что я отправлял несколько неверный URL-адрес, как только я скорректировав команду, чтобы указать на базовый /NuGet/
URL, он прошел нормально.
Не знаю, почему неправильный URL-адрес приводит к ошибке 413, но там вы идете. Надеюсь, это поможет кому-то.
РЕДАКТИРОВАТЬ: на основе приведенных ниже комментариев вам может быть больше удачи, просто ссылаясь на базовый URL http://www.myserver.com/
, а не на включение /NuGet. Стоит немного поиграть.
Ответ 2
Я знаю, что это старый вопрос, но сегодня я столкнулся с той же ошибкой. Стоит заметить, что я использую создание и публикацию пакетов TeamCity
. Во всяком случае, когда я пытаюсь Publish
мой огромный пакет (около 200 МБ), я был заблокирован этим. Решение было простым:
Вместо публикации в http://mynugetserver/api/v2/
, используйте: http://mynugetserver/
Ответ 3
Основываясь на ответах @Keith и @Nubigetter, я сделал несколько дальнейших исследований, потому что поведение казалось действительно странно для меня.
Ответ на самом деле находится в документации для Nuget.Server(если вы смотрите очень осторожно), это просто не очень очевидно:
Я поднял это с командой Nuget здесь https://github.com/NuGet/NuGetGallery/issues/2903, потому что я рассматриваю это поведение как "предоставление возможности для улучшения".
Ответ 4
Вам нужно будет установить этих парней на более высокие значения:
- system.web - httpRuntime - maxRequestLength, скажем, 1048576
- system.webserver - security - requestFiltering - requestLimits -
maxAllowedContentLength до, скажем, 1073741824
Оба значения находятся в другом блоке, поэтому второй должен быть больше первого.
Кроме того, посмотрите на www.myget.org, который я нашел замечательным при работе с Octopus Deploy.
Ответ 5
Проверьте конфигурацию serverRuntime
.
Атрибуты maxRequestEntityAllowed
и uploadReadAheadSize
соответственно настраивают ограничения на максимальное количество байтов, разрешенных в теле сущности запроса, и количество байтов, которые веб-сервер будет считывать в буфер, и перейти к расширению ISAPI.
Подробнее: http://www.iis.net/configreference/system.webserver/serverruntime
Я предполагаю, что вы используете SSL
, и установка uploadReadAheadSize
решит проблему. Поскольку во время процесса пересмотра клиента тело субъекта запроса должно быть предварительно загружено с использованием предварительной загрузки SSL. Предварительная загрузка SSL будет использовать значение свойства uploadReadAheadSize
, которое используется для расширений ISAPI.
Ниже приведены значения по умолчанию
<location path="Default Web Site">
<system.webServer>
<serverRuntime enabled="true"
uploadReadAheadSize="49152"
maxRequestEntityAllowed="4294967295" />
</system.webServer>
</location>
Ответ 6
То, что сработало для меня, было в этой статье:
http://blogs.blackmarble.co.uk/blogs/rfennell/post/2012/10/31/403-and-413-errors-when-publishing-to-a-local-Nuget-Server.aspx
"Важно: эта вторая ошибка была красной селедой, вам не нужен /nuget в конце URL-адреса"