我有一个 asp.net 核心应用程序,我开始通过 visual studio 构建它,当我按 F5 或在 visual studio 中按调试按钮时,它通常工作正常。
但是,如果我尝试从命令行使用 dotnet run
,它仍然有效并开始监听默认端口 5000(我假设这是 kestrel 监听)。
但是如果我尝试使用 http://localhost:5000 通过任何浏览器访问该页面,我只是收到错误提示无法连接。我知道如果我从 visual studio 运行,它会自动将我的应用程序置于 IIS 之后,但我不明白为什么如果应用程序只是自托管它就不起作用。
我想将我的项目转移到 Linux 环境中,这是目前唯一阻碍我的事情。我已经测试过通过 cli 创建新的 dotnet 应用程序,如果我尝试通过浏览器访问,这些应用程序工作正常,我在 VS 中创建的这个特定应用程序似乎不起作用。
我的 dotnet --version
返回 1.0.4
编辑(详细答案)
因此,为了补充下面 Sanket 的回答,我还弄清楚了为什么只有当我将 ASPNETCORE_ENVIRONMENT
设置为 Development 时我的应用才能运行的真正原因。
事实证明,我已经将测试邮件服务设置为仅在我的环境是开发环境时才配置,如下所示:
public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory,
WorldContextSeedData seeder)
{
if (env.IsEnvironment("Development"))
{
app.UseDeveloperExceptionPage();
loggerFactory.AddDebug(LogLevel.Information);
}
}
但是在我的一个 Controller 中,我没有像这样检查环境就初始化了邮件服务:
public AppController(IMailService mailService, IConfigurationRoot config, WorldRepository repository, ILogger<AppController> logger, IHostingEnvironment env)
{
_env = env;
_mailService = mailService;
_config = config;
_repository = repository;
_logger = logger;
}
当我决定为 Staging 环境配置 UseDeveloperExceptionPage()
时,我意识到了这个问题,当我在我的问题所在的地方运行它时,它就变得很明显了。我的 Controller 类试图在一开始没有配置邮件服务时初始化邮件服务。所以我像这样对我的 Controller 进行了一些更改:
public AppController(
#if Development
IMailService mailService,
#endif
IConfigurationRoot config,
IWorldRepository repository, ILogger<AppController> logger, IHostingEnvironment env)
{
_env = env;
#if Development
_mailService = mailService;
#endif
_config = config;
_repository = repository;
_logger = logger;
}
现在我的应用程序可以在任何环境中运行。
最佳答案
发生错误是因为 ASPNETCORE_ENVIRONMENT 变量的值不同。在 Visual Studio 的情况下,它被设置为 Development
,在 dotnet cli 的情况下(如您在相关屏幕截图中所见),它被设置为 Production
。
要使用命令行设置 ASPNETCORE_ENVIRONMENT 变量,请使用以下命令 -
setx ASPNETCORE_ENVIRONMENT "Development"
有关如何设置托管环境的更多信息,请参阅此 article .
关于c# - ASP.Net Core 应用程序可在 visual studio 中运行,但不适用于 dotnet run,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45551787/