[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/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

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏码农阿宇

.Net Core从命令行读取配置文件

最近在学习博客园腾飞(jesse)的.Net Core视频教程,收益匪浅,在此作推荐 : http://video.jessetalk.cn/ 言归正传,.Ne...

3054
来自专栏分布式系统和大数据处理

HttpModule介绍

Http 请求处理流程 和 Http Handler 介绍 这两篇文章里,我们首先了解了Http请求在服务器端的处理流程,随后我们知道Http请求最终会由实现了...

753
来自专栏林德熙的博客

VisualStudio 2017 项目格式 自动生成版本号 添加注释防止警告生成的文件自动添加版本

最近我把很多项目都使用了 VisualStudio 2017 新项目格式,在使用的时候发现一些比较好用的功能。 本文告诉大家如何使用 VisualStudio ...

6362
来自专栏跟着阿笨一起玩NET

在ASP.Net和IIS中删除不必要的HTTP响应头

转载:http://www.cnblogs.com/CareySon/archive/2009/12/14/1623624.html

1641
来自专栏分布式系统和大数据处理

Asp.Net 用户验证(自定义IPrincipal和IIdentity)

前一段时间有两个朋友问我,为什么在HttpModule中无法获得到Session值,因为他们希望自定义一个HttpModule,然后在其中获取Session来进...

2253
来自专栏技术小讲堂

ASP.NET AJAX(9)__Profile Service什么是ASP.NET Profile如何使用ASP.NET ProfileProfile ServiceProfile Service预

什么是ASP.NET Profile 可以为每个用户(包括匿名用户)储存信息 通过在Web.config中的配置即可在应用程序中使用 强类型的属性 可以定义属性...

4459
来自专栏.NET开发那点事

AServer - 基于Asp.net core Kestrel的超迷你http服务器

  AServer是基于ASP.NET Core Kestrel封装的一个超迷你http服务器。它可以集成进你的Core程序里,用来快速的响应Http请求,而不...

1511
来自专栏ASP.NETCore

在ASP.NET Core使用Middleware模拟Custom Error Page功能

在传统的ASP.NET MVC中,我们可以使用HandleErrorAttribute特性来具体指定如何处理Action抛出的异常.只要某个Action设置了...

1133
来自专栏晓晨的专栏

.NET Core 控制台应用程序使用异步(Async)Main方法

1063
来自专栏跟着阿笨一起玩NET

关于WinForm/Web如何使用缓存Cach

相对到期也称滑动到期:设置相对过期时间 指定时间内无访问会失效。(类似Session机制)

1631

扫码关注云+社区

领取腾讯云代金券