asp.net core 2.0 查缺補漏

solenovex發表於2018-01-09

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

相關文章