NuGet.Server returns 404错误

NuGet.Server returns 404 error

我已按照 instructions 设置和托管我自己的 NuGet 提要。我正在 运行 在 Windows 2012 (IIS 8.5) 框上安装 Web 应用程序。

我构建并 运行 解决方案并获得 default.aspx 页面...

也就是说 "You are running NuGet.Server v2.8.60318.667" 和 "Click here to view your packages".

当我单击 "here" link 时,我收到“404 - 找不到文件或目录”。错误。

似乎 url 路由不起作用,但我似乎无法确定我做错了什么。某些东西阻止了 odata 提要的工作。

我知道有很棒的 NuGet 服务器的第 3 方实现,但我真的很想让免费的运行起来,看起来应该很容易。如有任何想法或疑难解答提示,我们将不胜感激。

我有一个答案在我找到的任何一篇帖子中都没有提到。如果您将项目命名为 Nuget.Server,即使可以在 IIS 中发布,ninject 将无法设置包列表路由,因为它会尝试加载错误的 DLL 并出错。

以下是一些其他可能的答案:

Possible Answers 1

Possible Answers 2

我今天遇到了这个问题。实际上我需要做的是 Global.asax:

void Application_Start(object sender, EventArgs e) 
{
    NuGetRoutes.Start();
}

如果您将项目命名为 Nuget.Server,因为您生成的 dll 将是 Nuget.Server.dll,它将无法工作,因为 Nuget.Server.dll 是服务器的实际 dll。 将您的程序集名称重命名为其他名称。

%APPDATA%\NuGet 或 $(SolutionDir).nuget 中的 NuGet.config 文件可能引用了意外的 "active source" URLs。例如,TFS 构建代理安装带来的 nuget.exe 可能只知道 NuGet v2 协议,而 URLs 指的是 v3 协议。或者 NuGet.config.

中可能缺少自定义 NuGet 服务器 URL

我遇到了类似的问题,我找到了解决方案!我按照创建空 ASP.NET 项目(我在 VS2015 上)的说明创建了一个私有 nuget 服务器,然后安装 nuget.server(当前为 v2.11.3.0)。我能够 运行 并查看网页,但我无法使用 "nuget.exe push" 上传包。我遇到了可怕的 404 未找到错误。

我最终从 github 和 运行 直接克隆了 nuget.server 源代码,效果很好!?我发现我的 web.config 不正确。对我来说,关键是

<add name="ExtensionlessUrlHandler-Integrated-4.0" path="*." verb="GET,HEAD,POST,PUT,DEBUG" type="System.Web.Handlers.TransferRequestHandler" preCondition="integratedMode,runtimeVersionv4.0"/> 

<system.webServer>/<handlers> 

节。

我建议任何遇到问题的人都应该去 github 比较 web.config 文件。

顺便说一句:nuget.server 安装应该会取代您的 web.config。这对我来说可能无法正常工作。

我注意到当您尝试上传相当大的 nuget 包时出现 404 错误。我提高了 maxAllowedContentLength 并且它有所帮助。

<system.webServer>
  <security>
    <requestFiltering>
      <requestLimits maxAllowedContentLength="31457280"/>
    </requestFiltering>
  </security>
</system.webServer>

如果您创建一个新的空 VB 项目,您也会收到 404(在包中并使用 NuGet 管理器浏览)。

您似乎必须将项目创建为 C#,并且它像宣传的那样工作!

然而源代码看起来完全相同:(

我在干净的 Visual Studio 2017 Web 项目中遇到了这个问题。

Visual Studio 2015 重新创建并针对 .NET 4.6.1 进行整理

FWIW,我犯了一个错误,试图从 http://[server]/nuget/Packages and got the same error. Removing /Packages from the end of the source URL was the answer, so http://[server]/nuget 获取包是正确的 url。

此回答扩展了在 上留下的评论。

像他一样,我从一个 VB 项目开始,最后我和 OP 在同一个阵营。然而,对我有用的是将所有 C# 代码转换为这两个文件中的 VB。

  1. Default.aspx
  2. NuGetODataConfig.cs(用新文件替换了这个文件:NuGetODataConfig.vb)

为了完整起见,我在下面包含了这些文件的 post 转换内容。


Default.aspx

<%@ Page Language="VB" %>
<%@ Import Namespace="NuGet.Server" %>
<%@ Import Namespace="NuGet.Server.App_Start" %>
<%@ Import Namespace="NuGet.Server.Infrastructure" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml">
<head id="Head1" runat="server">
    <title>NuGet Private Repository</title>
    <style>
        body { font-family: Calibri; }
    </style>
</head>
<body>
    <div>
        <h2>You are running NuGet.Server v<%= Gettype(NuGetODataConfig).Assembly.GetName().Version %></h2>
        <p>
            Click <a href="<%= VirtualPathUtility.ToAbsolute("~/nuget/Packages") %>">here</a> to view your packages.
        </p>
        <fieldset style="width:800px">
            <legend><strong>Repository URLs</strong></legend>
            In the package manager settings, add the following URL to the list of 
            Package Sources:
            <blockquote>
                <strong><%= Helpers.GetRepositoryUrl(Request.Url, Request.ApplicationPath) %></strong>
            </blockquote>
            <% if string.IsNullOrEmpty(ConfigurationManager.AppSettings("apiKey")) Then %>
            To enable pushing packages to this feed using the <a href="https://www.nuget.org/downloads">NuGet command line tool</a> (nuget.exe), set the <code>apiKey</code> appSetting in web.config.
            <% else  %>
            Use the command below to push packages to this feed using the <a href="https://www.nuget.org/downloads">NuGet command line tool</a> (nuget.exe).
            <blockquote>
                <strong>nuget.exe push {package file} {apikey} -Source <%= Helpers.GetPushUrl(Request.Url, Request.ApplicationPath) %></strong>
            </blockquote>
            <% end if %>
        </fieldset>

        <% if Request.IsLocal Then  %>
        <fieldset style="width:800px">
            <legend><strong>Adding packages</strong></legend>

            To add packages to the feed put package files (.nupkg files) in the folder
            <code><% = PackageUtility.PackagePhysicalPath %></code><br/><br/>

            Click <a href="<%= VirtualPathUtility.ToAbsolute("~/nuget/clear-cache") %>">here</a> to clear the package cache.
        </fieldset>
        <% End If %>
    </div>
</body>
</html>

NuGetODataConfig.vb

Imports System.Net.Http
Imports System.Web.Http
Imports System.Web.Http.ExceptionHandling
Imports System.Web.Http.Routing
Imports NuGet.Server
Imports NuGet.Server.Infrastructure
Imports NuGet.Server.V2

<Assembly: WebActivatorEx.PreApplicationStartMethod(GetType(MGINuGet.App_Start.NuGetODataConfig), "Start")>

Namespace MGINuGet.App_Start
    Public Module NuGetODataConfig
        Public Sub Start()
            ServiceResolver.SetServiceResolver(New DefaultServiceResolver())

            Dim config As HttpConfiguration = GlobalConfiguration.Configuration

            NuGetV2WebApiEnabler.UseNuGetV2WebApiFeed(config, "NuGetDefault", "nuget", "PackagesOData")

            config.Services.Replace(GetType(IExceptionLogger), New TraceExceptionLogger())

            Trace.Listeners.Add(New TextWriterTraceListener(System.Web.Hosting.HostingEnvironment.MapPath("~/NuGet.Server.log")))
            Trace.AutoFlush = True

            config.Routes.MapHttpRoute(name:="NuGetDefault_ClearCache",
                                       routeTemplate:="nuget/clear-cache",
                                       defaults:=New With {Key .controller = "PackagesOData", Key .action = "ClearCache"},
                                       constraints:=New With {Key .httpMethod = New HttpMethodConstraint(HttpMethod.Get)})
        End Sub
    End Module
End Namespace