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

来源:http://www.cnblogs.com/linianhui/archive/2017/11/29/asp-net-core-with-iis-and-dotnet-watch-run.html
-Advertisement-
Play Games

在基於傳統的.NET Framework的Asp.Net Mvc的時候,本地開發環境中可以在IIS中建立一個站點,可以直接把站點的目錄指向asp.net mvc的項目的根目錄。然後build一下就可以在瀏覽器裡面刷新到最新的修改了,也可以附加到w3wp的進程進行調試。但是在開發基於.Net Core ...


在基於傳統的.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類型的項目,而且它自帶了Kertrel組件來監聽HTTP請求。這就使得IIS不再負責Asp.Net Core的運行了,而是作為一個反向代理來使用的,如下圖所示:

那麼如何優雅在滿足上面提到的2點需要呢?本文源代碼位於(https://github.com/linianhui/aspnetcore/tree/master/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.FileHelpers"
 4 #addin "Cake.Powershell"
 5 
 6 /// params
 7 var target = Argument("target", "default");
 8 
 9 /// iis web site config
10 var webSiteConfig = new {
11     host = "api.asp-net-core.dev",
12     path = "./src",
13     appPoolName = "apppool.noclr"
14 };
15 
16 /// deploy task
17 Task("deploy")
18     .Does(() =>
19 {
20     DeleteSite(webSiteConfig.host);
21 
22     CreateWebsite(new WebsiteSettings()
23     {
24         Name = webSiteConfig.host,
25         Binding = IISBindings.Http.SetHostName(webSiteConfig.host)
26                                   .SetIpAddress("*")
27                                   .SetPort(80),
28         ServerAutoStart = true,
29         PhysicalDirectory = webSiteConfig.path,
30         ApplicationPool = new ApplicationPoolSettings()
31         {
32             Name = webSiteConfig.appPoolName,
33             IdentityType = IdentityType.LocalSystem,
34             MaxProcesses = 1,
35             ManagedRuntimeVersion = null
36         }
37     });
38         
39     AddHostsRecord("127.0.0.1", webSiteConfig.host);
40 });
41 
42 /// open browser task
43 Task("open-browser")
44     .Does(() =>
45 {
46     StartPowershellScript("Start-Process", args =>
47     {
48         args.Append("chrome.exe")
49             .Append("'-incognito'")
50             .Append(", '" + webSiteConfig.host + "'");
51     });
52 });
53 
54 
55 /// default task
56 Task("default")
57 .IsDependentOn("deploy")
58 .IsDependentOn("open-browser");
59 
60 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=".\_log\" />
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/tree/master/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


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • Linux簡介及Ubuntu安裝 Linux,免費開源,多用戶多任務系統。基於Linux有多個版本的衍生。RedHat、Ubuntu、Debian 安裝VMware或VirtualBox虛擬機。具體安裝步驟,找百度。 再安裝Ubuntu。具體安裝步驟,找百度。 安裝完後,可以看到Linux系統的目錄 ...
  • 系統環境: CentOS 6.5 / 7.0 x86_64 Fedora 20 x86_64下載 PHP 源碼包 # wget http://cn2.php.net/distributions/php-5.5.15.tar.bz2# tar xf php-5.5.15.tar.bz2 -C /usr ...
  • Linux系統LVM分區減容擴容 目標:將VolGroup-lv_home縮小到20G,並將剩餘的空間添加給VolGroup-lv_root 1.首先查看磁碟使用情況 [root@localhost ~]# df -h 文件系統 容量 已用 可用 已用% 掛載點 Filesystem Size Us ...
  • ...
  • 首先請確認已購買了阿裡雲主機產品或萬網雲虛擬伺服器,購買產品後才能正常通過阿裡雲提交備案申請,另不同的產品類型,驗證方式也不同: 一、ECS、SLB、ACE和彈性web托管、建站市場(雲市場),產品類型請選擇“阿裡雲”。備案服務號請登錄用戶中心-備案管理中查詢;如何申請備案服務號? 二、雲虛擬主機產 ...
  • 返回總目錄 本小節目錄 Rename Method(函數改名) Add Parameter(添加參數) Remove Parameter(移除參數) 1Rename Method(函數改名) 概要 函數的名稱未能揭示函數的用途。 修改函數的名稱。 動機 將複雜的處理過程分解成小函數是良好的編程風格。 ...
  • 失敗的嘗試: regsvr32註冊:模塊已載入,但找不到入口點DllRegisterServer regasm註冊:需寫上regasm的完整路徑,註冊成功,但問題依舊 將項目的平臺改為x86:問題依舊 問題解決: 把Petro-SIM卸載重裝之後就好了。 之前的安裝,Petro-SIM可以正常使用, ...
  • ASP.NET Identity除了提供基於Cookie的身份驗證外,還提供了一些高級功能,如多次輸入錯誤賬戶信息後會鎖定用戶禁止登錄、集成第三方驗證、賬戶的二次驗證等,並且ASP.NET MVC的預設模板中就帶有這些功能。 本文將從以下幾個方面解釋ASP.NET Identity是如何實現身份驗證 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...