我有一个用.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!控制器”。但是,如果我从Visual Studio 2019内部调试(甚至在发布模式下打开),则相同的URL会引发404异常。
一些其他有助于查明问题的代码:
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();
}
}
答案 0 :(得分:4)
有一个非常相关的GitHub issue解释了这里发生的事情。来自ASP.NET Core团队的Pranav K说:
MVC 2.1.0要求编译上下文可用。编译上下文告诉它库是否引用MVC,该MVC用作过滤器以跳过被认为不太可能具有控制器的程序集。 Microsoft.NET.Sdk没有设置
<PreserveCompilationContext>true</PreserveCompilationContext>
,这可以解释您为什么看到此消息。
这意味着您可以使用两种解决方案来解决您遇到的问题:
PreserveCompilationContext
属性添加到您的.csproj文件中,其值为true
,如上所示。Microsoft.NET.Sdk.Web
项目SDK,而不是Microsoft.NET.Sdk
。我不知道这两个选项之间有什么明显的区别,但是我只是会更新项目SDK,因为它实际上是您正在构建的Web项目。