[Asp.Net Core] 1. IIS中的 Asp.Net Core 和 dotnet watch


在基於傳統的.NET Framework的Asp.Net Mvc的時候,本地開發環境中可以在IIS中建立一個站點,可以直接把站點的目錄指向asp.net mvc的項目的根目錄。然后build一下就可以在瀏覽器里面刷新到最新的修改了,也可以附加到w3wp的進程進行調試。但是在開發基於.Net Core的Asp.Net Core項目的時候,這樣的做法已經無法滿足我們的需要了:

  1. 更改完代碼build一下,無需部署即可在瀏覽器得到最新的更改
  2. 附加到進程調試

Asp.Net Core的項目需要先Pubilsh一下才能部署到IIS,而且中間需要一個AspNetCoreModule的模塊來中轉一下。這主要是因為Asp.Net Core的項目本質上來說是一個Console類型的項目,而且它自帶了Kestrel組件來監聽HTTP請求。這就使得IIS不再負責Asp.Net Core的運行了,而是作為一個反向代理來使用的,如下圖所示:

那么如何優雅在滿足上面提到的2點需要呢?本文源代碼位於(https://github.com/linianhui/aspnetcore.example/tree/master/src/dotnet.watch.run)

dotnet watch

 dotnet watch 屬於dotnet cli tool里面的一部分功能,其用途在於擴充dotnet cli的命令,為它們添加一個監視的功能,即在使用cli運行dotnet core的項目的時候,當你修改了項目的源代碼,那么save一下源碼,即可刷新得到最新的更改。比如我們用 dotnet run 運行了我們的一個Asp.Net Core項目,想要修改的話就需要先停止運行,然后修改代碼,再一次運行才能看到結果。而如果使用了 dotnet watch run 來運行的話則省去了停止運行的過程,直接修改保存即可。享受到這樣的好處只需再你的csproj文件中增加一個引用即可。

<ItemGroup>
    <DotNetCliToolReference Include="Microsoft.DotNet.Watcher.Tools" Version="2.0.0" />
</ItemGroup> 

當我修改了ValuesController.cs文件的內容的時候,watch會自動退出當前正在運行的進程,然后再一次啟動它。是不是很方便呢?

IIS中的 dotnet watch

如何把Asp.Net Core部署到IIS這里就不解釋了,只貼一下我寫的Cake部署腳本:

 1 #addin "Cake.IIS"
 2 #addin "Cake.Hosts"
 3 #addin "Cake.Powershell"
 4 
 5 var target = Argument("target", "default");
 6 
 7 var rootPath = "./";
 8 var solution = rootPath + "aspnetcore.example.sln";
 9 var srcProjectPath  = rootPath + "src/";
10 
11 var websites = new []{
12     new {
13         host = "dotnet.watch.run",
14         path = srcProjectPath + "dotnet.watch.run/",
15     }
16 };
17 
18 Task("deploy-iis")
19     .Description("部署到iis")
20     .DoesForEach(websites, (website) => 
21 {
22     AddHostsRecord("127.0.0.1", website.host);
23 
24     DeleteSite(website.host);
25 
26     CreateWebsite(new WebsiteSettings
27     {
28         Name              = website.host,
29         Binding           = IISBindings.Http.SetHostName(website.host)
30                                             .SetIpAddress("*")
31                                             .SetPort(80),
32         ServerAutoStart   = true,
33         PhysicalDirectory = website.path,
34         ApplicationPool   = new ApplicationPoolSettings
35         {
36             Name                  = website.host,
37             IdentityType          = IdentityType.LocalSystem,
38             MaxProcesses          = 1,
39             ManagedRuntimeVersion = "v4.0"
40         }
41     });
42 });
43 
44 Task("open-browser")
45     .Description("打開瀏覽器")
46     .Does(() =>
47 {
48     StartPowershellScript("Start-Process", args =>
49     {
50         var urls = "";
51         foreach(var website in websites){
52             urls += ",'http://" + website.host + "/'";
53         }
54 
55         args.Append("chrome.exe")
56             .Append("'-incognito'")
57             .Append(urls);
58     });
59 });
60 
61 
62 /// default task
63 Task("default")
64     .Description("默認操作")
65     .IsDependentOn("deploy-iis")
66     .IsDependentOn("open-browser");
67 
68 RunTarget(target);

 

由於我們要使用dotnet watch這個命令,所以在部署的時候並沒有對Asp.Net Core的項目進行Build和Publish,而是直接指向了其源代碼目錄。那么在哪里讓IIS執行dotnet watch呢?答案是web.config里面:

 1 <?xml version="1.0" encoding="utf-8"?>
 2 <configuration>
 3   <system.webServer>
 4     <handlers>
 5       <remove name="aspNetCore" />
 6       <add name="aspNetCore"
 7            path="*"
 8            verb="*"
 9            modules="AspNetCoreModule"
10            resourceType="Unspecified" />
11     </handlers>
12     <aspNetCore processPath="dotnet"
13                 arguments="watch run"
14                 stdoutLogEnabled="true"
15                 shutdownTimeLimit="2"
16                 stdoutLogFile=".\" />
17   </system.webServer>
18 </configuration>

其中重點在於aspnetcore節點的processPath="dotnet"arguments="watch run"。這個配置節點是供AspNetCoreModule使用的,其詳細的配置參數請移步這里:https://docs.microsoft.com/en-us/aspnet/core/hosting/aspnet-core-module。這樣在IIS中訪問的時候,AspNetCoreModule就會使用 dotnet watch run來運行我們的項目。就可以實現編輯代碼->保存->在瀏覽器中刷新就可以直接看到結果了!

使用附加到進程調試IIS中的Asp.Net Core

由於Asp.Net Core是單獨運行的Console應用,所以調試部署在IIS中的Asp.Net Core的時候就不是像之前那樣附加到w3wp進程了,而是運行項目的dotnet進程(由dotnet watch run運行起來的嘛)。

。。。。。。一下子有四個dotnet的進程,到底是哪一個呢?我也不知道,,,查了半天也沒查出來原因,可以確定是受的arguments="watch run"影響:

  1. arguments="watch run":4個。
  2. arguments="run":2個。
  3. arguments=".\bin\debug\netcoreapp2.0\Dotnet.Watch.Run.dll":1個。

有了解這塊的麻煩告知,謝謝!

參考

本文源代碼:https://github.com/linianhui/aspnetcore.example/tree/master/src/dotnet.watch.run

AspNetCoreModule:https://docs.microsoft.com/en-us/aspnet/core/fundamentals/servers/aspnet-core-module?tabs=aspnetcore2x

AspNetCoreModule Config:https://docs.microsoft.com/en-us/aspnet/core/hosting/aspnet-core-module

Kertrel:https://docs.microsoft.com/en-us/aspnet/core/fundamentals/servers/kestrel?tabs=aspnetcore2x

dotnet watch:https://docs.microsoft.com/en-us/aspnet/core/tutorials/dotnet-watch


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM