2017-08-29 95 views
1

在ASP.NET MVC Core 2.0中向BuildWebHost()添加可选方法的正确方法是什么?ASP.NET MVC Core 2.0 - 删除用于部署到Azure网站的UserKestrel()?

我需要在我的开发环境中添加UseKestrel()以在本地启用HTTPS,但是由于Azure网站不喜欢它,因此我需要删除它。

背景:

我将ASP.NET MVC Core 1.1应用程序迁移到2.0。特别是,我也跟着关于Program.cs的变化在这里列出的步骤:

https://docs.microsoft.com/en-us/aspnet/core/migration/1x-to-2x/#update-main-method-in-programcs

该文件概述了构建虚拟主机......基于这样所需的新格局,这里是新的2.0版的我BuildWebHost()方法,在发展工程:

public static IWebHost BuildWebHost(string[] args) => 
    WebHost.CreateDefaultBuilder(args) 
    .UseIISIntegration() 
    .UseContentRoot(Directory.GetCurrentDirectory()) 
    .UseStartup<Startup>() 
    .UseKestrel(options => 
    { 
     options.Listen(IPAddress.Loopback, 5001, listenOptions => 
     { 
     listenOptions.UseHttps("mycert.pfx", "password"); 
     }); 
    }) 
    .Build(); 

部署到Azure中后,我得到了502.5的错误,并期待在捻事件日志,我发现这一点:

Application 'MACHINE/WEBROOT/APPHOST/BEASTMUFFIN' with physical root 'D:\home\site\wwwroot\' failed to start process with commandline 'dotnet .\BeastMuffin.Web.dll', ErrorCode = '0x80004005 : e0434352. 

搜索并阅读有关该特定错误代码,我意识到这可能与我的Program.cs有关,并且已经关注了UseKestrel()方法调用。

我注意到了该行,并重新发布,它的工作完美。

因此,回到原来的问题......我如何遵循构建虚拟主机的新模式,但在本地运行时,包含UseKestrel()方法及其选项?

回答

2

首先我想说我是你的粉丝。很多年前,在LearnVisualStudio.net上咬牙切齿,甚至说服我的雇主(当时)给我终生会员资格。谢谢你,先生!

选项#1:我已经看到了肖恩Wildermuth在几个不同的Pluralsight视频使用此代码(#如果DEBUG),并怀疑它可能工作为您的目的。

public static IWebHost BuildWebHost(string[] args) => 
 
    WebHost.CreateDefaultBuilder(args) 
 
    .UseIISIntegration() 
 
    .UseContentRoot(Directory.GetCurrentDirectory()) 
 
    .UseStartup<Startup>() 
 
#if DEBUG  
 
    .UseKestrel(options =>H 
 
    { 
 
     options.Listen(IPAddress.Loopback, 5001, listenOptions => 
 
     { 
 
     listenOptions.UseHttps("mycert.pfx", "password"); 
 
     }); 
 
    }) 
 
#endif  
 
    .Build();

选项#2:添加IHostingEnvironment到程序主方法签名,并呼吁根据环境变量不同HostBuild方法。

 public static void Main(string[] args, IHostingEnvironment env) 
 
     { 
 
      if (env.IsEnvironment("Development")) 
 
      { 
 
       BuildLocalWebHost(args).Run(); 
 
      } 
 
      else 
 
      { 
 
       BuildAzureWebHost(args).Run(); 
 
      } 
 
     }

希望这有助于或在正确的方向至少百分点。

+0

双倍的好答案。 :)首先,感谢#if DEBUG提示。我听说肖恩做了一件了不起的工作。我只是不愿意看到别人的内容,因为害怕剽窃指责。另外,我没有意识到你可以在这样的方法调用链中使用它!第二,谢谢你的个人笔记。我很高兴成为这么多人的学习体验的一小部分。祝你好! –

+0

其实,我先尝试了后一种解决方案,因为它感觉正确......但是,IHostingEnvironment会传递给它吗?在我的情况下,当我尝试运行这个命令时,我收到一条错误消息:“程序不包含适用于入口点的静态'Main'方法” –

+0

另外,还有一件事情是......从实验中,名称该方法必须是:BuildWebHost()...否则EF Core 2工具将不起作用。在我看来,这在文档中没有被充分强调。 –