2019年7月22日 星期一

ASP.NET Core 2.2 Web API讀取 Request.Body時出現 BadHttpRequestException: Reading the request body timed out due to data arriving too slowly

參考 BadHttpRequestException: Reading the request body timed out due to data arriving too slowly

原本在 1.* Web API 的版本上執行正常的程式升級為 2.2時出現  BadHttpRequestException: Reading the request body timed out due to data arriving too slowly
出錯錯誤的程式碼為

StreamReader sr = new StreamReader(Request.Body);
string str = await sr.ReadToEndAsync();

專家找出的問題應該是 tread 的問題,我的環境是在 CentOS 7上,使用 docker佈署 Web API的程式,目前文章上有三種作法
第一種在 Startup.cs ConfigureServices 加上下列程式碼
services.Configure<KestrelServerOptions>(options =>{
options.Limits.MinRequestBodyDataRate = new MinDataRate(1, TimeSpan.FromMinutes(5));
options.Limits.MinResponseDataRate = new MinDataRate(1, TimeSpan.FromMinutes(5));
options.Limits.MaxRequestBodySize = 100000000;
});

2019年7月11日 星期四

使用 Dockerfile建置 ASP.NET Core 2以上使用的 Image

參考 Exploring the .NET Core MCR Docker files (updated): runtime vs aspnet vs sdk

在參考文章有詳細的說明
要使用 mcr開頭,如 FROM mcr.microsoft.com/dotnet/core/aspnet:2.2

使用 ASP.NET Core連結 MongoDB Atlas

MongoDB Atlas 說明 (官網的文件寫的非常詳細,對於初學者有很大幫助)
Download .NET Core 2.2
ASP.NET Core 2.2 簡介 
Visual Studio Code (參考 使用Visual Studio Code开发.NET Core看这篇就够了 安裝 C#)

MongoDB Atlas是官方 MongoDB雲端的方案,可以建立一個 Free Tier Cluster,容量大小是有限制的。

MongoDB對於各語言都有對應的 driver,對 C#也有很好的支持, 2017年 12月就使用 ASP.Net Core 1.x的版本連結至 Atlas時,在本機端 (Windows)是沒有問題的,但因為我想使用 docker + jenkins佈署程式到 CentOS卻發生問題,後來在 MongoDB官網說明,.Net Core library在 Linux or OSX不支援 SNI TLS Extension,所以無法連到 Atlas Free Tier Cluster,所以後續開發程式改用別的方法進行。

但最近 MongoDB官網提出新的說明,只要使用 .Net Core 2.1以上的版本就可以開始連線,這部分用 Visual Studio Code使用 ASP.NET Core 2.2進行程式測試,在本機端 (Windows) OK,用 Docker在 CentOS上測試也沒問題。

2019年1月29日 星期二

OAuth2 Server實作,使用 Spring Boot

參考文件:
Spring OAuth 2 Developers Guide

如果你有很多系統但想用同一個方式登入,存取資源的話,建立 OAuth2 Server是一個好方法,可以參考 spring-security-oauth的方式來建立。 但目前很多範例是用 Spring Boot來建立,我參考的 Secure Spring REST With Spring Security and OAuth2 (github source code) 就是。
幾個點跟大家分享:


儲存 token, user帳號、宓碼會有三種方式
1.InMemory的方式,也是預設的方式

2.把資訊記錄在資料庫內,使用 jdbc data store,參考的範例內有 H2和 Postgresql,其它分享有用 MySQL的方式,如果是用 H2的話,一開始應該會放在本機,如果要用 remote模式要參考 Allow remote access to H2 Database設定,宓碼變更請參考 set password

3.jwt方式spring security 5.1開始就只支援這種方式


文章有提到會建立 Authorization Server, Resource Server,實際上是建立相關的 configuration class設定的動作,基本上有三個,也可以只寫一個 class extends 三個類別

2019年1月28日 星期一

Spring Boot

Spring Boot出來很久了,但因為工作上沒有使用到,所以一直沒有學習,最近又想了解 OAuth2才知道它的存在,短暫的學習心得,發現它跟 .Net Core有類似,用大量 annotation, dependency injection,還有以前的 xml設定檔,現在都用 class替代了,有興趣的人可以參考如下網站

Spring Boot 基础
Adding Classpath Dependencies
Building microservices with Netflix OSS, Apache Kafka and Spring Boot – Part 1: Service registry and Config server
Deploy a Spring Boot MicroService with Netflix OSS stack in Docker Container

2019年1月6日 星期日

ASP.Net Core 2.2 on Docker with certification

如果要使用自己的自制憑證和跑在 docker上,我的 dockerfile和 appsetting.json檔案參考如下:

docker file
FROM mcr.microsoft.com/dotnet/core/aspnet:2.2

WORKDIR /app
 
ENV ASPNETCORE_URLS https://*:443
EXPOSE 443

COPY . /app

ENV ASPNETCORE_ENVIRONMENT production

ENTRYPOINT ["dotnet", "xxxxx.dll"]


appsetting.json
{
  "ConnectionStrings": {
      ................................................
  },
  "Logging": {
         .....................................
  },

  "Kestrel": {
    "Certificates": {
      "Default": {
        "Path": "certificate_file_name.pfx",
        "Password": "xxxxxxxxxxxxxxx"

      },
      "AllowInvalid": "true"
    }
  }
}

ASP.Net Core 2.2 在 Docker container使用 EF Core連結 SQL Server出現問題

參考:SqlException: Connection Timeout Expired. The timeout period elapsed during the post-login phase.

在 windows 環境下直接執行 asp.net core 2.2的程式透過 entity framework core連接 SQL server是沒有問題的情況,想說放在 docker上執行,但一直發生 timeout的情況,後來找到一篇文章提到要更新 SQL Server的 patch到最新的版本試試。

Asp.Net Core 2.2 使用 HttpClient 連結 SSL網址處理方法

參考: [faq]解決C#呼叫有ssl憑證問題的網站出現遠端憑證是無效的錯誤問題

加上 handler處理


var handler = new HttpClientHandler();
handler.ClientCertificateOptions = ClientCertificateOption.Manual;
handler.ServerCertificateCustomValidationCallback =
    (httpRequestMessage, cert, cetChain, policyErrors) =>
{   
  return true;
};
var client = new HttpClient(handler);