asp.net core 2.0 查缺补漏

asp.net core 2.0 一些有用有趣的设置.

面向(targeting)不同的.net版本:

打开asp.net core 2.0的项目文件: xxx.csproj, 这部分:

<Project Sdk="Microsoft.NET.Sdk.Web">

  <PropertyGroup>
    <TargetFramework>netcoreapp2.0</TargetFramework>
  </PropertyGroup>

TargetFramework就是指向的版本. 也可以指向多个.net版本, 那就使用TargetFrameworks, 例如:

<TargetFrameworks>netcoreapp2.0;net47</TargetFrameworks>

编译后, 在bin/debug文件夹下就会有两个文件夹:

Microsoft.AspNetCore.All

并不是标准的Nuget包, 它不包含任何代码或dll, 它作为一个metapackage, 引用了很多其他的包而已

Program.cs

asp.net core 应用其实就是一个控制台应用, 运行了asp.net core相关的库而已.

program.cs里面都是对于宿主和环境的配置.

在这里, 已经进行了默认的配置.

但是如果你想捕获asp.net core启动时候的错误, 并显示错误页面, 那么:

.CaptureStartupErrors(true)

是否应该监听Microsoft.AspNetCore.Hosting.Server.IServer制定的url(ipv4, v6, hostname, localhost, unix socket), 可以使用:

.PreferHostingUrls(true)

监听指定的url:

.UseUrls("http://0.0.0.0:5000")

使用ApplicationInsights:

.UseApplicationInsights()

Startup.cs

startup里面是用来预加载/配置服务和中间件的.

ConfigureServices方法用来注册服务.

Configure方法用来配置请求管道.

添加mvc中间件, 就在ConfigureServices方法里:

services.AddMvc();

使用mvc中间件, 在Configure里:

app.UseMvc(routes =>
            {
                routes.MapRoute("default", "{controller=Home}/{action=Index}/{id?}");
            });

Dependency Injection

每次调用创建一个实例:

services.AddTransient<IEmailService, EmailService>();

每次http请求创建一个实例:

services.AddScoped<IEmailService, EmailService>();

只创建一个实例:

services.AddSingleton<IEmailService, EmailService>();

如果你不想让容器自动dispose掉服务(容器会自动调用服务的Dispose方法), 那么你应该手动添加服务, 例如:

services.AddSingleton(new EmailService());

http 请求管道中间件的顺序 最佳实践:

1. 异常处理中间件

2. 静态文件中间件

3. 用户验证中间件

4. mvc中间件

创建自定义中间件

有两种方法:

1. 直接在Startup里面写

可以使用四个方法: Run, Map, MapWhen, Use.

Run方法直接短路, 返回Response.

Map用于处理分支, 判断请求地址的开头, 为分支添加特定中间件等等

MapWhen也是处理分支, 但是可以控制分支的状态

Use, 可以调用下一个中间件(next.Invoke())或者短路请求.

2. 单独写一个类

public class CommunicationMiddleware
    {
        private readonly RequestDelegate _next;

        public CommunicationMiddleware(RequestDelegate next)
        {
            _next = next;
        }

        public async Task Invoke(HttpContext context)
        {
            await _next.Invoke(context);
        }
    }

然后再写一个extension 方法:

public static class CommunicationMiddlewareExtension
    {
        public static IApplicationBuilder UseCommunicationMiddleware(this IApplicationBuilder builder)
        {
            return builder.UseMiddleware<CommunicationMiddleware>();
        }
    }

最后在Startup的Configure里调用即可:

 app.UseCommunicationMiddleware();

            app.UseMvc(routes =>
            {
                routes.MapRoute("default", "{controller=Home}/{action=Index}/{id?}");
            });

Url Redirection 和 Url Rewriting

他们是不同的.

url redirection是从服务器端绕了一圈, 然后回到客户端, 客户端收到301或者302之后, 再调用新地址.

url rewriting是服务器端自己完成的, 客户端一无所知.

可以这样来使用Url Rewriting:

var options = new RewriteOptions()
                .AddRewrite("NewUser", "/User/Registration/Index", false);
            app.UseRewriter(options);

异常处理

默认情况下400到599的错误信息都不会显示. 就会显示一个异常页面.

但是可以自定义错误页面:

app.UseStatusCodePages("text/plain", "HTTP ERROR: Status Code: {0}");

多个环境

asp.net core 2.0默认先加载appSettings.json, 然后根据环境不同再加载appSettings.{environment}.json. 如果有必要就覆盖或替换一些值.

根据环境使用不同的Startup文件:

.UseStartup("AssemblyName")

StartupDevelopment, StartupStaging, StartupProduction.

Web Api的三种风格

RTC, 包含Action的Name

Rest, 它是一种http协议的最佳实践方式而已. 主要目的是管理和控制资源.

HATEOAS, 客户端通过遍历http response里面的超媒体链接, 可以动态导航到所需的资源, 酷.

使用HATEOAS, 需要安装包Halcyon.mvc

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

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏张善友的专栏

ASP.NET Web API 处理架构

这篇文章主要是介绍ASP.NET Web API的处理架构:当一个HTTP请求到达直到产生一个请求的过程。ASP.NET Web API 的处理架构图如下,主要...

30980
来自专栏转载gongluck的CSDN博客

程序的入口

操作系统装载应用程序后,做完初始化工作就转到程序的入口点执行。程序的默认入口点由连接程序设置, 不同的连接器选择的入口函数也不尽相同。在VC++下,连接...

38290
来自专栏酷玩时刻

10分钟搭建属于自己的ngork服务器,实现内网穿透Window启动脚本Mac Linux启动脚本

ngrok 是一个使用go语言编写的反向代理软件,通过在公共的端点和本地运行的 Web 服务器之间建立一个安全的通道。

45330
来自专栏静默虚空的博客

Eclipse 实用技巧

代码智能提示 Java智能提示 Window -> Preferences -> Java -> Editor -> Content Assist -> Aut...

22470
来自专栏数据分析

[译]Asp.net MVC 之 Contorllers(二)

URL路由模块 取代URL重写 路由请求 URL路由模块的内部结构 应用程序路由 URL模式和路由 定义应用程序路由 处理路由 路由处理程序 处理物理文件请求 ...

39660
来自专栏IMWeb前端团队

浏览器中的ECMAScript模块(译)

本文作者:IMWeb zzbozheng 原文出处:IMWeb社区 未经同意,禁止转载 原文:https://jakearchibald.com/20...

21480
来自专栏令仔很忙

EF大数据批量处理----BulkInsert

之前做项目的时候,做出来的系统的性能不太好,在框架中使用了EntityFramework,于是就在网上查资料,研究如何提高EF的性能。 在这分享一篇博客 批...

21530
来自专栏林德熙的博客

Roslyn 如何在 Target 引用 xaml 防止文件没有编译

在使用新的项目格式,可以使用 Target 添加项目,但是有一些项目需要在合适的时候添加,如果添加早了,那么会让用户看到这些文件,如果添加的时间是在引用编译之后...

9210
来自专栏张善友的专栏

.NET Migration工具

Migration是一种分布环境下的数据库同步工具,出现在Ruby on Rail框架里,MigratorDotNet是一个.NET类似于Ruby on Rai...

23190
来自专栏码农阿宇

在.Net Core中使用MongoDB的入门教程(一)

首先,我们在MongoDB的官方文档中看到,MongoDb的2.4以上的For .Net的驱动是支持.Net Core 2.0的。 ? 所以,在我们安装好了Ma...

38340

扫码关注云+社区

领取腾讯云代金券