2017-08-29 125 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工具將不起作用。在我看來,這在文檔中沒有被充分強調。 –