调试时WebApi返回404错误,发布后可以正常工作

4
我有一个控制台应用程序,是用 .NET Core 2.2.6 编写的,使用 Kestrel 来托管一个简单的 WebApi。
public class SettingsController : Controller
{
    // 
    // GET: /settings/

    public string Index()
    {
        return $"Hello world! controller";
    }
}

如果我发布代码并运行可执行文件,我可以访问http://127.0.0.1:310/settings并看到预期的“Hello world! controller”。然而,如果我在Visual Studio 2019中进行调试(甚至在发布模式下打开),相同的URL会抛出404异常。

Publish profile

一些其他可能有助于确定问题的代码:
public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
    WebHost.CreateDefaultBuilder(args)
        .ConfigureKestrel((context, options) =>
        {
            options.ListenAnyIP(310, listenOptions =>
            {
                listenOptions.Protocols = HttpProtocols.Http1;
            });
        })
        .UseStartup<Startup>();

public class Startup
{
    public void ConfigureServices(IServiceCollection services)
    {
        services.AddMvc();
    }

    public void Configure(IApplicationBuilder app, IHostingEnvironment env)
    {
        app.UseDefaultFiles(new DefaultFilesOptions()
        {
            DefaultFileNames = new List<string>() { "index.html" }
        });

        // Return static files and end the pipeline.
        app.UseStaticFiles(new StaticFileOptions
        {
            OnPrepareResponse = ctx =>
            {
                const int durationInSeconds = 60 * 60 * 24;
                ctx.Context.Response.Headers[HeaderNames.CacheControl] =
                    "public,max-age=" + durationInSeconds;
            }
        });

        // Use Cookie Policy Middleware to conform to EU General Data 
        // Protection Regulation (GDPR) regulations.
        app.UseCookiePolicy();

        // Add MVC to the request pipeline.
        app.UseMvcWithDefaultRoute();
    }
}

@strickt01:我没有launchsettings.json文件,也没有使用IIS Express。我正在使用Kestrel。端口号在上面的代码中指定(options.ListenAnyIP(310, listenOptions =>)。与Web服务器的连接已经建立,因为我收到了404错误,并且我可以看到控制台记录Kestrel接收到请求但找不到文件的信息。 - Mark Cilia Vincenti
@KirkLarkin: <Project Sdk="Microsoft.NET.Sdk"> - Mark Cilia Vincenti
1个回答

6

有一个非常相关的GitHub问题解释了这里发生了什么。来自ASP.NET Core团队的Pranav K表示:

MVC 2.1.0需要可用的编译上下文。 编译上下文告诉它是否引用了MVC库,该库用作跳过被认为不太可能具有控制器的程序集的过滤器。 Microsoft.NET.Sdk未设置<PreserveCompilationContext>true</PreserveCompilationContext>,这可能解释了您看到这个问题的原因。

这意味着有一些解决问题的工作方案:

  1. PreserveCompilationContext属性添加到.csproj文件中,并将其值设置为true,如上所示。
  2. 引用Microsoft.NET.Sdk.Web项目SDK而不是Microsoft.NET.Sdk

我不知道这两个选项之间是否有明显的区别,但考虑到它实际上是一个Web项目,我会更新项目SDK。


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