原文:点这

本文的源代码在此:

你过你是.NET Core的入门者,你可以先看看下面这篇文章:

命令行工具

我是在Windows上创建这个应用的,但是你可以在安装了.NET SDK的Mac或者Linux上面做同样的事情.

http://dot.net这下载.NET SDK. 下载并安装完.NET SDK后开始创建一个新项目于.

步骤如下:

  • 创建一个新文件夹
  • CD到这个文件夹下
  • 在命令行窗口运行dotnet new创建一个新项目
  • 运行dotnet restore下载必要的NuGet包
  • 运行dotnet run运行你的项目

可以看到我们只需要3步就完成了从创建到运行一个.NET应用的所有工作.

首先使用dotnet new创建一个项目,此时在项目文件夹下会有一个program.cs文件它包含一个public Main()方法, 就像其他的控制台程序一样.

然后你需要使用dotnet restore来下载项目所需的NuGet包. 空项目自己下载所需要的依赖包.

一旦你从NuGet下载完了所以依赖的包后使用dotnet run来运行你的项目:

现在你可以打开自动生成的program.cs文件,修改代码, 如下:

using System;

namespace ConsoleApplication
{
public class Program
{
public static void Main(string[] args)
{
Console.WriteLine("Hello World. Time is: " +
DateTime.Now.ToString("t"));
}
}
}

回到命令窗口运行dotnet run你可以看到如下输出.

Hello World. Time is: 5:36 PM

注意当你运行dotnet run的时候会自动编译你的代码. 这里没有显性的编译步骤 - 当然你可以使用dotnet build来显性的编译项目.

回顾一下:

  • 安装.NET
  • 运行3个命令
  • 一些可运行的.NET代码

我的可执行程序在哪?

你可能注意到我们没有执行一个EXE文件, 我们只是在包含project.json的文件夹中执行了dotnet run, project.json文件中会告诉我们如何启动应用.

代码被编译放到了bin目录下的dll中.

ASP.NET是怎么样的呢?

ASP.NET Core是一个运行了Web server的控制台应用.

下面修改Main函数,让程序变成一个Web应用在浏览器上跑起来:

using System;
using System.IO;
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting;
using Microsoft.AspNetCore.Http; namespace ConsoleApplication
{
public class Program
{
public static void Main(string[] args)
{
var host = new WebHostBuilder()
.UseKestrel()
.UseStartup<Startup>()
.Build(); host.Run();
}
} public class Startup
{
public void Configure(IApplicationBuilder app)
{
app.Run(async (context) =>
{
await context.Response.WriteAsync(
"Hello World. The Time is: " +
DateTime.Now.ToString("hh:mm:ss tt")); });
}
}
}

下面需要修改下project.json添加上Kestrel Web server和Http extensions:

"dependencies": {
"Microsoft.AspNetCore.Server.Kestrel": "1.0.0"
},
"frameworks": { ... }

现在回到命令行运行

dotnet restore

获取依赖包,再运行

dotnet run

现在你应该能看到一个提示,Web服务器在5000端口上启动了. 在浏览器中打开http://localhost:5000,现在你应该可以看到来自于ASP.NET Core的问候了:

Hello World. The Time is: 6/3/2016 2:32:20 PM

可以看到一样的控制台应用结构被用来服务ASP.NET了.

Middleware

Main()中的代码使用了Kestrel,并对其进行了配置用来处理Web请求. 配置委托给了Startup类来处理,通常Startup应该放在一个单独的文件中.

Startup类中我们可以使用自定义的中间件来影响ASP.NET管道. Middleware本质上如同经典ASP.NET的HttpHandlerHttpModule.

App.Run()

上面的代码中Startup使用了App.Run()中间件.

App.Use - Middleware Modules

如果说App.Run()是个Http handler, 那么App.Use()就像个HttpModule. App.Use()可以串联起来按照指定的顺序来执行. 修改代码用来在每个请求的前后来执行一定的任务.

Configure方法的App.Run()前添加下面代码:

app.Use(async (context, next) =>
{
await context.Response.WriteAsync("Pre Processing"); await next(); await context.Response.WriteAsync("Post Processing");
});

Ctrl-c停止服务后运行dotnet run重新运行程序,结果如下:

Pre Processing...Hello World. The Time is: 6/3/2016 3:10:19 PMPost Processing...

可以看到App.Use()的输出包裹住了App.Run()的输出. .

使用ASP.NET MVC

光向上面一样使用App.Use()App.Run()还达不到创建一个正式项目的程序.

当你创建一个Web应用的时候你需要使用更高级的东西比如ASP.NET MVC. 比起自己来实现中间件, ASP.NET MVC提供了丰富的中间件让你及其方便的来创建Web应用. 一旦配置好, 创建一个经典的ASP.NET Core MVC应用和之前你创建ASP.NET MVC应用一样简单.

下面我们在Startup中加入ASP.NET MVC,并创建一个简单的API用来返回JSON数据.

首先在project.json中添加下面的包:

  • "Microsoft.AspNetCore.Mvc": "1.0.0"

运行dotnet restore来现在依赖包.

修改Startup类:

using System;
using System.IO;
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.DependencyInjection; namespace ConsoleApplication
{
public class Program
{
public static void Main(string[] args)
{
var host = new WebHostBuilder()
.UseKestrel()
.UseStartup<Startup>()
.Build(); host.Run();
}
} public class Startup
{ public void ConfigureServices(IServiceCollection services)
{
services.AddMvc();
} public void Configure(IApplicationBuilder app)
{
app.UseMvc();
}
}
}

上面的代码在ConfigureServices()中设置了所需的依赖注入,然后在Configure()中使用了MVC. 这是一个典型的模式: ConfigureServices()用来初始化依赖注入. Configure() then adjusts the behavior of the middleware which is typically a more specific wrapper around App.Use(). app.AddMvc()app.UseMvc()都是扩展方法,它们来自于Microsoft.AspNetCore.Mvc package.

在这个例子中MVC没用进行一些显性的配置, 但是其他的providers如EntityFrame或者Logging provider需要你配置一些连接字符串之类的.

下面来创建一个controller,代码如下:

public class HelloWorldController
{
[HttpGet("api/helloworld")]
public object HelloWorld()
{
return new
{
message = "Hello World",
time = DateTime.Now
};
}
}

这个controller有一个可以返回匿名对象数据的API端点. 因为是一个API所以它的结果会被序列化 - 通常是一个JSON格式 (依赖于客户端浏览器的accept header).

现在回到命令行运行dotnet run. 打开http://localhost:5000/api/helloworld.

可以看到下面的结果:

{
message: "Hello World",
time: "2016-06-03T15:39:18.339626-07:00"
}

POCO Controller

注意上面的controller并没有继承Controller类. ASP.NET Core会知道HelloWorldController是一个Controller,因为他的后缀是Controller. 除非你需要使用Controller的一些特性,不然你不需要继承Controller.

添加Razor视图

接下来在controller中添加另外一个方法来展示Helloworld视图. 首先我们需要添加一些package. project.json添加下面的内容:

  • "Microsoft.Extensions.Configuration.FileExtensions": "1.0.0"

运行dotnet restore, 然后在Main()中使用.UseContentRoot()用来提供应用的根路径

public static void Main(string[] args)
{
var host = new WebHostBuilder()
.UseContentRoot(Directory.GetCurrentDirectory())
.UseKestrel()
.UseStartup<Startup>()
.Build();
host.Run();
}

UseContentRoot是必须要的!

现在在Helloworld控制器中添加一个方法. 注意在ASP.NET Core MVC中支持在一个controller中同时使用API和MVC端点, 因此在这我不需要另外再创建一个controller:

[HttpGet("helloworld")]
public ActionResult HelloworldMvc()
{
ViewBag.Message = "Hello world!";
ViewBag.Time = DateTime.Now; return View("helloworld");
//return View("~/helloworld.cshtml");
}

注意了在我们的controller是用来处理API请求的时候,controller没有继承自Controller. 但在这我们需要让我们的controller继承Controller,因为在这我们使用了ViewBagView,他们都是Controller的成员.

让我们的controller继承自Controller:

public class HelloworldController : Controller

/Views/Helloworld文件夹下创建helloworld.cshtml.

视图的代码非常简单,如下:

<label>Message:</label>
@ViewBag.Message <hr/> <label>Time:</label>
@ViewBag.Time

现在你需要在project .jsonbuildoption section中添加如下配置:

  • "preserveCompilationContext": true

    如果你用了动态的视图这个配置是必须的.

现在回到命令行再次运行dotnet run 在浏览器中打开http://localhost:5000/helloworld

可以看到如下页面:

Message: Hello world!
---
Time: 6/3/2016 9:29:12 PM

所有的代码如下:

using System;
using System.IO;
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.AspNetCore.Http; namespace ConsoleApplication
{
public class Program
{
public static void Main(string[] args)
{
var host = new WebHostBuilder()
.UseContentRoot(Directory.GetCurrentDirectory())
.UseKestrel()
.UseStartup<Startup>()
.Build(); host.Run();
}
} public class Startup
{
public void ConfigureServices(IServiceCollection services)
{
services.AddMvc();
} public void Configure(IApplicationBuilder app)
{
app.UseDeveloperExceptionPage(); app.UseMvc(); //app.Use(async (context, next) =>
//{
// await context.Response.WriteAsync("Pre Processing");
// await next();
// await context.Response.WriteAsync("Post Processing");
//}); // Handler of last Resort
app.Run(async (context) =>
{
await context.Response.WriteAsync(
"Hello World of the last resort. The Time is: " +
DateTime.Now.ToString("hh:mm:ss tt")); });
}
} public class HelloWorldController : Controller
{
[HttpGet("api/helloworld")]
public object HelloWorld()
{
return new
{
message = "Hello World",
time = DateTime.Now
};
} [HttpGet("helloworld")]
public ActionResult HelloworldMvc()
{
ViewBag.Message = "Hello world!";
ViewBag.Time = DateTime.Now; return View("helloworld");
//return View("~/helloworld.cshtml");
}
}
}

IIS去哪了?

到现在为止我们只是在Windows上运行了一个控制台应用, 没有使用诸如IIS之类的WEB服务器来托管我们的应用. 因为ASP.NET Core使用了一个自托管的WEB服务器(Kestrel它是一个ASP.NET Core的高性能WEB服务器 which ASP.NET Core’s high performance Web Server).

但是,并不推荐在Internet中直接通过Kestrel来访问我们的应用. 你应该使用一个前端的反向代理,例如Windows上的IIS,Linux上面的Nginx.

Running on a Mac

到目前为止我们一直是在Windows机器上来运行程序的, 但上面的代码可以不经任何修改的搬到Mac上运行!


PS: 第一次使用Markdown编辑文章,挺好。

[译]初识.NET Core & ASP.NET Core的更多相关文章

  1. .NET Core & ASP.NET Core 1.0在Redhat峰会上正式发布

    众所周知,Red Hat和微软正在努力使.NET Core成为Red Hat企业版Linux (RHEL)系统上的一流开发平台选项.这个团队已经一起工作好几个月了,RHEL对.NET有许多需求.今天在 ...

  2. .NET Core & ASP.NET Core 1.0

    .NET Core & ASP.NET Core 1.0在Redhat峰会上正式发布 众所周知,Red Hat和微软正在努力使.NET Core成为Red Hat企业版Linux (RHEL) ...

  3. Do You Kown Asp.Net Core -- Asp.Net Core 2.0 未来web开发新趋势 Razor Page

    Razor Page介绍 前言 上周期待已久的Asp.Net Core 2.0提前发布了,一下子Net圈热闹了起来,2.0带来了很多新的特性和新的功能,其中Razor Page引起我的关注,作为web ...

  4. ASP.NET Core 配置 Entity Framework Core - ASP.NET Core 基础教程 - 简单教程,简单编程

    原文:ASP.NET Core 配置 Entity Framework Core - ASP.NET Core 基础教程 - 简单教程,简单编程 ASP.NET Core 配置 Entity Fram ...

  5. .NET Core ASP.NET Core Basic 1-2 控制反转与依赖注入

    .NET Core ASP.NET Core Basic 1-2 本节内容为控制反转与依赖注入 简介 控制反转IOC 这个内容事实上在我们的C#高级篇就已经有所讲解,控制反转是一种设计模式,你可以这样 ...

  6. [.NET Core]ASP.NET Core中如何解决接收表单时的不支持的媒体类型(HTTP 415 Unsupported Media Type)错误呢?

    [.NET Core]ASP.NET Core中如何解决接收表单时的不支持的媒体类型(HTTP 415 Unsupported Media Type)错误呢? 在ASP.NET Core应用程序中,接 ...

  7. ASP.NET Core - ASP.NET Core MVC 的功能划分

    概述 大型 Web 应用比小型 Web 应用需要更好的组织.在大型应用中,ASP.NET MVC(和 Core MVC)所用的默认组织结构开始成为你的负累.你可以使用两种简单的技术来更新组织方法并及时 ...

  8. 比较ASP.NET和ASP.NET Core[经典 Asp.Net v和 Asp.Net Core (Asp.Net Core MVC)]

    ASP.NET Core是.与.Net Core FrameWork一起发布的ASP.NET 新版本,最初被称为ASP.NET vNext,有一系列的命名变化,ASP.NET 5.0,ASP.NET ...

  9. 为什么使用.Net Core, Asp.net Core以及部署到云端

    一,基于微软技术平台开发的应用项目,如果有以下的需求和潜在需求,建议使用.Net Core和Asp.net core技术架构: 1. 跨平台支持 2. 采用微服务架构 3. 使用Docker容器 4. ...

随机推荐

  1. php-cgi not found

    错误描述 用PHPStorm运行PHP脚本的时候浏览器提示"502 Bad Gateway",PHPStorm提示"php-cgi not found". 系统 ...

  2. 开窗函数 First_Value 和 Last_Value

    在Sql server 2012里面,开窗函数丰富了许多,其中带出了2个新的函数 First_Value 和 Last Value .现在来介绍一下这2个函数的应用场景. 首先分析一下First_Va ...

  3. Spring, MyBatis 多数据源的配置和管理

    同一个项目有时会涉及到多个数据库,也就是多数据源.多数据源又可以分为两种情况: 1)两个或多个数据库没有相关性,各自独立,其实这种可以作为两个项目来开发.比如在游戏开发中一个数据库是平台数据库,其它还 ...

  4. centos6.5无法访问网络

    1.在network Adapter选中,右侧是否是选中为NAT 2.打开网络和共享中心-->更改适配器设置,VMnet8和VMnet1是否是自动获取了IP,自动获取ip连接上后 3.右击本地连 ...

  5. css实现页面元素居中

    水平居中 对于已知宽度的块级元素实现水平居中只需要设置 margin-left:auto; margin-right:auto; 对于多个块级元素实现水平居中只需要设置 //1 父类{ text-al ...

  6. 一枚招聘信息——微信支付web前端开发工程师【已招到】

    已招到 工作地点: 深圳 职位类别: 技术类 招聘人数: 1人 工作职责: 负责微信支付h5应用产品的前端开发:负责微信支付营销活动,h5游戏的开发:负责微信支付内部平台的开发与日常维护 工作要求: ...

  7. [No00009A]JsonToObject json与类互转

    using System.Web.Script.Serialization; /// <summary> /// 内部类,保存jsonData /// </summary> p ...

  8. [LeetCode] Word Pattern II 词语模式之二

    Given a pattern and a string str, find if str follows the same pattern. Here follow means a full mat ...

  9. [LeetCode] Reverse Integer 翻转整数

    Reverse digits of an integer. Example1: x = 123, return 321 Example2: x = -123, return -321 click to ...

  10. 【教程】简易CDQ分治教程&学习笔记

    前言 辣鸡蒟蒻__stdcall终于会CDQ分治啦!       CDQ分治是我们处理各类问题的重要武器.它的优势在于可以顶替复杂的高级数据结构,而且常数比较小:缺点在于必须离线操作. CDQ分治的基 ...