我有一个asp.net核心应用程序,我开始通过visual studio构建,通常它在我按F5或在visual studio中按下调试按钮时工作正常。
但是,如果我尝试从命令行使用dotnet run
,它仍然可以工作并开始监听默认端口5000(我假设这是红隼监听)。
但如果我尝试使用http://localhost:5000通过任何浏览器访问该页面,我只会收到错误消息,指出无法连接。我明白,如果我从visual studio运行,它会自动将我的应用程序放在IIS后面,但我不明白为什么如果应用程序只是自托管它不起作用。
我想将我的项目移到linux环境中,这是现在唯一似乎阻止我的事情。我已经测试过通过cli创建新的dotnet应用程序,如果我尝试通过浏览器访问,那些工作正常,我似乎在VS中创建的这个特定的应用程序不起作用。
我的dotnet --version
返回1.0.4
因此,为了添加Sanket下面的答案,我还想出了为什么我的应用只有在我将ASPNETCORE_ENVIRONMENT
设置为开发时才能正常工作的真正原因。
事实证明,我设置了一个测试邮件服务,只有在我的环境是这样的开发时才配置:
public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory,
WorldContextSeedData seeder)
{
if (env.IsEnvironment("Development"))
{
app.UseDeveloperExceptionPage();
loggerFactory.AddDebug(LogLevel.Information);
}
}
但是在我的一个控制器中,我没有像这样检查环境,而是将电子邮件服务初始化:
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()
时,我意识到了这个问题,一旦我运行了问题,它就变得很明显了。我的控制器类在第一次配置时尝试初始化邮件服务。所以我对控制器进行了一些更改,如下所示:
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;
}
现在我的应用可以在任何环境中使用。
答案 0 :(得分:3)
由于 ASPNETCORE_ENVIRONMENT 变量的值不同而发生错误。对于Visual Studio,它设置为Development
,如果是dotnet cli(正如您在相关屏幕截图中看到的那样),则为Production
。
要使用命令行设置ASPNETCORE_ENVIRONMENT变量,请使用以下命令 -
setx ASPNETCORE_ENVIRONMENT "Development"
有关如何设置托管环境的详细信息,请参阅此article。