通过3个Hello World应用来了解ASP.NET 5应用是如何运行的(2)

简介:

对于上面创建的这个Hello World应用来说,程序入口点由应用自身来提供,所以应用本身具有自我执行的能力。从应用托管(Host)的角度来讲,这样的应用同时负责对自身的托管。将应用与托管环境独立起来其实是更好的选择,因为这样可以使同一个应用运行于不同的环境中。接下来我们就来演示如何为应用指定入口程序来达到应用与应用托管的分离。现在我们在HelloWorld目录下创建两个子目录,并分别将它们命名为Project2Project3。Project2代表应用本身,但是真正的入口程序则由Project3代表的项目提供,换句话说Project3是Project2 的宿主(Host)。两个项目对应目录及其源文件结构:

Project2
    Startup.cs
    project.json

Project3
    Program.cs
    project.json

 

我们在Project2目录下添加一个文本文件并将其命名为Startup.cs,并按照如下的方式定义一个同名的类型。

1
2
3
4
5
6
7
8
9
10
11
12
using System;
 
namespace Project2
{
     public class Startup
     {
         public void Configure()
         {
             Console.WriteLine( "Hello World!" );
         }
     }
}

如上面的代码片断所示,我们在Startup类中定义了一个Configure方法,我们希望在应用的入口程序在正常启动并完成初始化之后自动回调这个方法。对于应用自身来说,Startup是被启动之后最先执行的类型,我们可以将一些针对应用的配置定义在Configure方法中。不过作为演示,我们仅仅让此方法在控制台上打印“Hello World”字样。

我们说过任何一个被KRuntime视为项目的目录必须包含一个project.json文件,所以我们需要在Project2目录下创建这个一个文本文件,我们指定的入口程序就定义在这个文件之中。如下所示的是这个project.json文件的内容,我们仅仅在其commands配置项中添加了一个名为“RunFromProject3”的命令,对应的值为“Project3 Startup Configure”,其中Project3代表包含入口程序的程序集(项目Project3被编译后生成的程序集)名称,Startup和Configure组成的字符串数组将作为程序入口方法(Main)的参数,它们分别表示应用启动程序所在的类型和对应的方法。我们同时在dependencies这个配置项中添加了针对Project3的项目依赖,这相当于在当前项目中添加了一个对应的项目引用。

1
2
3
4
5
6
7
8
{
    commands:{
       "RunFromProject3" : "Project3 Startup Configure"
    },
    dependencies:{
        "Project3" : ""
   }
}

接下来我们在Project3目录下添加一个文本文件并将其命名为Program.cs,然后安装如下的形式定义这个作为程序入口的Program类型。与上面演示的第一个Hello World应用一样,作为程序入口的类型必须命名为Program,其中包含一个静态或者实例Main方法。如上面的代码片断所示,Main方法的目的在于解析定义在Project2的Startup类型,然后据此类型实例化一个对应的对象并调用其Configure方法。类型和方法的名称来源于Main方法的参数,而类型解析采用的程序集名称与当前目录(%CD%)名称一致。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
using System;
using System.IO;
using System.Reflection;
using System.Linq;
 
namespace Project3
{
     public class Program
     {
         public void Main(string[] args)
         {
             string startup           = args[0];
             string configure         = args[1];
             string appBase           = Directory.GetCurrentDirectory();
             string appName           = appBase.Substring(appBase.LastIndexOf( '\\' ) + 1);
 
             Type startupType = Assembly.Load( new AssemblyName(appName))
                    .GetTypes().FirstOrDefault(type => type.Name == startup);
             startupType.GetMethod(configure)
                 .Invoke(Activator.CreateInstance(startupType), new object[] { });
         }
     }
}

image

在完成对作为入口程序的Program类的定义之后,我们同样需要在Project3目录下创建一个必需的project.json文件。和第一个演示的Hello World应用一样,这里不需要任何的配置,所以直接将内容设置为“{}”即可。

在Project2的project.json文件中,我们在其commands配置项中定义了一个命令,其实这个命令是为K.cmd定义,我们可以直接利用后者执行这个命令。与执行第一个Hello World程序一样,我们开启CMD命令行工具。在通过CD命令将Project2设置为当前目录之后,我们按照如下的方式执行K RunFromProject3(RunFromProject3是在project.json中定义的命l令名称)。从控制台的输出可以确定我们的应用被正常启动了。

设置自定义的入口程序体现应用本身与应用托管之间的分离,它使我们可以创建独立于托管环境的应用,并根据需要寄宿于任何一个我们希望的宿主程序下,对于Web应用来说这一点尤为重要。对于之前的Web应用来说,IIS是它们唯一的宿主,但是ASP.NET 5应用却可以将我们指定的入口程序作为宿主。如果将应用寄宿于我们指定的宿主程序,这样的寄宿方式被称为Self-Host,接下来我们将通过一个具体的例子来演示如何定义一个简单的ASP.NET MVC应用,并采用Self-Host的方式启动它。

通过3个Hello World应用来了解ASP.NET 5应用是如何运行的(1)
通过3个Hello World应用来了解ASP.NET 5应用是如何运行的(2)
通过3个Hello World应用来了解ASP.NET 5应用是如何运行的(3)


作者:蒋金楠
微信公众账号:大内老A
微博: www.weibo.com/artech
如果你想及时得到个人撰写文章以及著作的消息推送,或者想看看个人推荐的技术资料,可以扫描左边二维码(或者长按识别二维码)关注个人公众号(原来公众帐号 蒋金楠的自媒体将会停用)。
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
相关文章
|
12月前
|
C#
一个.NET开源、轻量级的运行耗时统计库 - MethodTimer
一个.NET开源、轻量级的运行耗时统计库 - MethodTimer
147 3
|
存储 Shell Linux
快速上手基于 BaGet 的脚本自动化构建 .net 应用打包
本文介绍了如何使用脚本自动化构建 `.net` 应用的 `nuget` 包并推送到指定服务仓库。首先概述了 `BaGet`——一个开源、轻量级且高性能的 `NuGet` 服务器,支持多种存储后端及配置选项。接着详细描述了 `BaGet` 的安装、配置及使用方法,并提供了 `PowerShell` 和 `Bash` 脚本实例,用于自动化推送 `.nupkg` 文件。最后总结了 `BaGet` 的优势及其在实际部署中的便捷性。
621 10
|
19天前
|
API C++ Windows
Visual C++运行库、.NET Framework和DirectX运行库的作用及常见问题解决方案,涵盖MSVCP140.dll丢失、0xc000007b错误等典型故障的修复方法
本文介绍Visual C++运行库、.NET Framework和DirectX运行库的作用及常见问题解决方案,涵盖MSVCP140.dll丢失、0xc000007b错误等典型故障的修复方法,提供官方下载链接与系统修复工具使用指南。
344 2
|
10月前
|
C# Android开发 iOS开发
2025年全面的.NET跨平台应用框架推荐
2025年全面的.NET跨平台应用框架推荐
399 23
|
12月前
|
前端开发 Android开发
WinForm 直接运行 Admin.NET
本文介绍了如何将 Admin.NET 以 WinForm 桌面程序模式运行,简化了手动配置 Web 服务的过程,便于演示和作为单机软件使用。通过添加特定 NuGet 包、修改 `Program.cs` 和 `Form1.cs` 文件,并调整项目配置,最终实现了在 WinForm 中嵌入 WebView 组件显示 Admin.NET 界面的效果。
149 0
WinForm 直接运行 Admin.NET
|
12月前
|
开发框架 监控 .NET
【Azure App Service】部署在App Service上的.NET应用内存消耗不能超过2GB的情况分析
x64 dotnet runtime is not installed on the app service by default. Since we had the app service running in x64, it was proxying the request to a 32 bit dotnet process which was throwing an OutOfMemoryException with requests >100MB. It worked on the IaaS servers because we had the x64 runtime install
203 5
|
JSON 算法 安全
JWT Bearer 认证在 .NET Core 中的应用
【10月更文挑战第30天】JWT(JSON Web Token)是一种开放标准,用于在各方之间安全传输信息。它由头部、载荷和签名三部分组成,用于在用户和服务器之间传递声明。JWT Bearer 认证是一种基于令牌的认证方式,客户端在请求头中包含 JWT 令牌,服务器验证令牌的有效性后授权用户访问资源。在 .NET Core 中,通过安装 `Microsoft.AspNetCore.Authentication.JwtBearer` 包并配置认证服务,可以实现 JWT Bearer 认证。具体步骤包括安装 NuGet 包、配置认证服务、启用认证中间件、生成 JWT 令牌以及在控制器中使用认证信息
428 2
|
数据采集 JSON API
.NET 3.5 中 HttpWebRequest 的核心用法及应用
【9月更文挑战第7天】在.NET 3.5环境下,HttpWebRequest 类是处理HTTP请求的一个核心组件,它封装了HTTP协议的细节,使得开发者可以方便地发送HTTP请求并接收响应。本文将详细介绍HttpWebRequest的核心用法及其实战应用。
509 6
|
Linux iOS开发 开发者
跨平台开发不再难:.NET Core如何让你的应用在Windows、Linux、macOS上自如游走?
【8月更文挑战第28天】本文提供了一份详尽的.NET跨平台开发指南,涵盖.NET Core简介、环境配置、项目结构、代码编写、依赖管理、构建与测试、部署及容器化等多个方面,帮助开发者掌握关键技术与最佳实践,充分利用.NET Core实现高效、便捷的跨平台应用开发与部署。
1400 3
|
缓存 Java API
【揭秘】.NET高手不愿透露的秘密:如何让应用瞬间提速?
【8月更文挑战第28天】本文通过对比的方式,介绍了针对 .NET 应用性能瓶颈的优化方法。以一个存在响应延迟和并发处理不足的 Web API 项目为例,从性能分析入手,探讨了使用结构体减少内存分配、异步编程提高吞吐量、EF Core 惰性加载减少数据库访问以及垃圾回收机制优化等多个方面,帮助开发者全面提升 .NET 应用的性能和稳定性。通过具体示例,展示了如何在不同场景下选择最佳实践,以实现更高效的应用体验。
219 3

热门文章

最新文章