2021年3月30日 星期二

.Net Core EF Core Power Tools

之前有篇文章有寫到.Net Core 問題4 DB First後來發現另一個VS套件可以使用
1.先至官網安裝EF Core Power Tools
2.在專案上右鍵EF Core Power Tools
3.點選Add Database Connection
4.填寫連線內容(跟Framework的模型很像吧)
5.選擇Table 或其他DB功能
6.Scaffold-DbContext
Context name:輸入您要的(預設都自動帶出)
Namespace:輸入您要的(預設都自動帶出)
EntityType path:您要存放的路徑資料夾, 例如你想放在專案下的Models資料夾裡就輸入Models
...中間略可不設定用預設比較好
Pluralize or signularize generated object names:將產生的物件名稱複數化或單數化",設定為"勾選"時 後面多出"s"
Use table and column names directly from the database:使用資料表原始名稱(CX_Name沒打勾時會變成CxName)跟之前的-use-database-names一樣
Use DataAnnotation attributes to configure the model:
Custiomize code using Handlebars templates
Include connection string in generated code:連線字串放於Context中建議不勾
Install the EF Core provider pageage in the project
參考來源
EF Core Power Tools

2021年2月3日 星期三

Bootstrap 問題 找不到popper.js

Bootstrap4.5.3使用了bootstrap-select 或是bootstrap-multiselect都會遇到下面問題
Uncaught TypeError: Bootstrap's dropdowns require Popper.js
collapse.js:363 Uncaught TypeError: u is not a constructor
缺少了Popper.js檔可至cdn下載所需的但目前版本v2.x以上好像也不行
使用popper.js 1.16.1的話是可以的
參考來源
https://stackoverflow.com/questions/60837918/dropdown-js186-uncaught-typeerror-u-is-not-a-constructor-returning-when-i-clic
Bootstrap 4 error “Bootstrap dropdown require Popper.js”, with Aurelia CLI and Require.js

2021年1月14日 星期四

.Net Core 問題7 HTTP ERROR 413.1 - Request Entity Too Large

目前在寫一個.net core上傳
ok這都很簡單網路上一堆code
Html
<form enctype="multipart/form-data" method="post" asp-controller="FileStream" asp-action="Upload">
    多選檔案:<input type="file" name="File" multiple  />    <input type="submit" value="上傳" />
</form>
Controller
private IWebHostEnvironment _hostingEnvironment;
private readonly IFunction_Error _functionerror;
public FileStreamController(IWebHostEnvironment environment, IFunction_Error functionerror)
{
  _hostingEnvironment = environment;            
}
public IActionResult Index()
{
  return View();
}

[HttpPost]       
public async Task Upload(List file)
{       
  string uploadfolder = Path.Combine(_hostingEnvironment.WebRootPath, "files");      
  foreach (IFormFile item in file)
  {
   if (item.Length > 0)
   {
     string filePath = Path.Combine(uploadfolder, item.FileName);
     using (Stream fileStream = new FileStream(filePath, FileMode.Create))
     {
       await item.CopyToAsync(fileStream);
     }
   }
  }
 return View();
 }
Ok很簡單吧
User:我今天上傳了80MB的檔案出現了以下問題
好吧只好找解法了大概如下
1.Program加入
 serverOptions.Limits.MaxRequestBodySize = long.MaxValue;
 ...
 
2.startup加入
services.Configure(options =>
{
  options.MultipartBodyLengthLimit = long.MaxValue;
  ....
});
 
3.Controller加入
 [DisableRequestSizeLimit]
 
以上三種都沒用最後註解掉
看到一篇加入一個web.config程式碼如下
居然通了80MB上傳沒問題
一直以為.net core是沒web.conifg的
<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <system.webServer>
    <security>
      <requestFiltering>
        <requestLimits maxAllowedContentLength="2147483647" />
      </requestFiltering>
    </security>
  </system.webServer>
</configuration>
User說:剛剛上傳了150MB的檔案都沒出現錯誤但檔案又沒傳上去
發現List<IFormFile> file是null但後端是有收到
感覺是大小沒問題只不過設定上有些不正確
接著就將startup那段註解的加了回去終於不null了
services.Configure(options =>
{
  options.BufferBodyLengthLimit = long.MaxValue;
  options.KeyLengthLimit = int.MaxValue;
  options.MultipartBodyLengthLimit = long.MaxValue;
  options.MultipartBoundaryLengthLimit = int.MaxValue;
  options.ValueCountLimit = int.MaxValue;
  options.ValueLengthLimit = int.MaxValue;
});
注意上面的MaxValue要修正阿不要真的那麼大還是要依專案來設定
參考來源
.net core issues: 413 Request Entity Too Large nginx
Kestrel web server implementation in ASP.NET Core [资源分享].netcore 部署时遇到413 Request Entity Too Large 和 413Payload Too Large 的问题 asp.net core 3.0 解除文件上传大小限制,500.30、413、api-post-form方法拿不到参数 解决方案 How to increase file upload size in ASP.NET Core https://www.aspsnippets.com/Articles/ASPNet-Core-IFormFile-always-returns-NULL.aspx .Net Core IFormFile 始终为空的问题

2020年12月25日 星期五

Docker 06.Rename TAG

先前學會建立Image後發現TAG都是latest
TAG可用來區別版本是相當好用的
先前Build時語法如下
docker build -t samplecore .
可改成
docker build -t samplecore:1.0 .
如果要修改iamge名稱和tag時可輸入
指令 Image ID REPOSITORY:TAG
docker image tag  4c575b75980e officialcore:2.0
這時刪除掉舊的1.0時會發現磁碟的容量大小沒變
他們的Image Id是一樣的
參考來源
docker image tag
Docker how to change repository name or rename image?

Docker 05.備份及還原Image

建立了image後一定會想到到時如果換機器
或是要發佈到正式機器但又不想重新產生image
打開powershell
備份
先查看目前
docker images
指令 目的端 REPOSITORY:TAG
docker save -o d:\temp\samplecore.tar samplecore:latest
還原
指令 來源端
docker load -i d:\temp\samplecore.tar
參考來源
docker save
docker load

2020年12月24日 星期四

Docker 04.Asp.Net Core建立Image

測試了半天Dockerfile的部分還是不太懂
依微軟的的範例好像也做不太出來(功力太淺)
網路上找到了[個人筆記] docker個人筆記進行測試後修改居然可以使用
來看一下我的目錄吧
一個方案四個專案將Dockerfile放一起
撰寫Dockerfile(這邊是重點寫錯就無法成功)
內容為何可參考如何將 ASP.NET Core 2.1 網站部署到 Docker 容器中
FROM mcr.microsoft.com/dotnet/core/sdk:3.1 AS build
WORKDIR app

# copy csproj and restore as distinct layers
COPY *.sln .
COPY coresample.language/*.csproj ./coresample.language/
COPY coresample.model/*.csproj ./coresample.model/
COPY coresample.service/*.csproj ./coresample.service/
COPY coresample.web/*.csproj ./coresample.web/

# copy everything else and build app
COPY coresample.language/. ./coresample.language/
COPY coresample.model/. ./coresample.model/
COPY coresample.service/. ./coresample.service/
COPY coresample.web/. ./coresample.web/
RUN dotnet publish -c Release -o out

FROM mcr.microsoft.com/dotnet/core/aspnet:3.1 AS runtime
ENV ASPNETCORE_URLS=http://+:8080
WORKDIR /app
EXPOSE 8080/tcp
COPY --from=build /app .
ENTRYPOINT ["dotnet", "coresample.web.dll"]
打開powershell執行
docker build -t samplecore .
中間略...
Successfully built da35a45ea2bf
Successfully tagged samplecore:latest
開啟軟體Docker Desktop
也可輸入以下
指令 名稱 port 來源image
docker run -d  --name  MyFistApp -p 8081:8081  samplecore:latest  
輸入資料 > Run
在瀏覽器中顯示
剛剛的步驟產生了許多image
藍色:IN USE的
紅色:可刪除
紫色:可留著重複使用
參考來源
[個人筆記] docker個人筆記
如何將 ASP.NET Core 2.1 網站部署到 Docker 容器中

2020年12月23日 星期三

Docker 03.修改Docker Root Dir位置

C槽通常只給OS使用但也常爆掉
所以可將依些資料性的檔案移至D槽
打開posershell輸入docker info即可知道目前位置
舊版的位置名稱為graph
新版的位置名稱為data-root
修改方式這邊使用docker desktop內建功能如下圖加入
當然也是可以使用powershell來輸入指令看個人
"data-root": "d:\\Docker"
查詢後則自動變更資料夾也跑到指定的位置
PS:如果有原本已經掛好的image搬移後會消失
個人覺得一開始就決定好位置比較好
但萬一事後才改則將C:\ProgramData\Docker裡的檔案copy至新的位置
參考來源
How To Change Docker Data Folder Configuration

Docker 02.測試由Docker Hub取得image資料

先來測試一下由Docker Hub取得Image資料
開啟Power Shell輸入以下便會從Docker Hub取得Image
docker pull mcr.microsoft.com/windows/servercore/iis
以下為完成訊息
Using default tag: latest
latest: Pulling from windows/servercore/iis
4612f6d0b889: Pull complete
aa4f58cd6da1: Pull complete
398f819f5bf0: Pull complete
9785ac8bf905: Pull complete
4e1656d5847d: Pull complete
Digest: sha256:8cbddbe8bace29ba7fd84cda3850d44dbdc5e20fd9183a135f048e462d4da69e
Status: Downloaded newer image for mcr.microsoft.com/windows/servercore/iis:latest
mcr.microsoft.com/windows/servercore/iis:latest
由上篇語法輸入docker images即可看到以下資料
REPOSITORY                                 TAG       IMAGE ID       CREATED       SIZE
mcr.microsoft.com/windows/servercore/iis   latest    c938e0847f9c   2 weeks ago   5.31GB
進入Docker Desktop > Images > Local也可看到資訊,然後點選Run啟動
Container Name:windows(輸入您好記得名稱)
Ports:8081(輸入您想要port)
也可輸入
指令 名稱 port 來源image
docker run -d  --name  MyFistApp -p 8081:8081  image名稱 
到Containers/Apps即可看到啟動中
在瀏覽器上輸入http://localhost:8081即可瀏覽
再次點選剛剛的image啟動Run換一個port可以在另外開一個Containers一樣開啟瀏覽器可瀏覽
以上為使用Docker Hub上的Image
參考來源
[Docker] 容器初體驗 - 搞個 IIS Container 來部署網站 https://hub.docker.com/_/microsoft-windows-servercore-iis

2020年12月18日 星期五

Docker 01.初學安裝Docker Desktop For Windows 10

學海無涯今天來學Docker
1.先了解Docker是什麼,因個人是實作派的所以說明不是我的強項,找了看過自己覺得有兩篇寫的易懂的文章如下
a.ASP.NET Core Docker 筆記 1 - 初探
b.ocker - Docker for Windows 10 入門篇

2.安裝需求官方文件如下
What to know before you install
System Requirements
Windows 10 64-bit: Pro, Enterprise, or Education (Build 16299 or later).

For Windows 10 Home, see Install Docker Desktop on Windows Home.

Hyper-V and Containers Windows features must be enabled.
The following hardware prerequisites are required to successfully run Client Hyper-V on Windows 10:

64 bit processor with Second Level Address Translation (SLAT)
4GB system RAM
BIOS-level hardware virtualization support must be enabled in the BIOS settings. For more information, see Virtualization.
官網下載基本上下一步到底應該不會有問題

3.啟動Docker問題
Q:Cannot enable Hyper-V service
A:控制台 > 程式集 > 開啟或關閉windows功能 > 檢查Hyper-V 及Containers有沒有打勾 > 確定有後重新開機
A:以上還是不行開始使用:準備適用於容器的 Windows,管理員權限開啟powershell輸入
& $Env:ProgramFiles\Docker\Docker\DockerCli.exe -SwitchDaemon .
A:最後我是使用控制台開啟或關閉windows功能 > Hyper-V關掉 > 重開機 > 再開啟Hyper-V > 重開機 >可以使用Docker了

常用語法:
可顯示版本資訊
docker version
docker --version
查目前的Docker Image
docker images
查目前的Docker Container
docker ps
後續有再新增...

參考來源
ASP.NET Core Docker 筆記 1 - 初探
ocker - Docker for Windows 10 入門篇
開始使用:準備適用於容器的 Windows
Unable to start Docker on Windows 10: Cannot enable Hyper-V service #6772
Install Docker Desktop on Windows

2020年11月6日 星期五

MongoDB 07.createIndex

無論是關聯式資料庫或是NoSQL
Index都相當重要
尤其在資料量大時特別顯著
MongoDB如何建立Index
目前使用Robo 3T來連線,右鍵資料庫 > Open Shell
語法如下
降冪-1升冪 1
1.單一欄位
db.collectionName.createIndex({"age":1})
2.多重欄位
db.collectionName.createIndex({"name":-1,"age":1})
也可以使用Robo 3T > Collection上右鍵 > Add Index
經過測試百萬筆資料後有Index跟無Index速度真的差很多
參考來源
db.collection.createIndex()
MongoDB 索引

MongoDB 06.C# Filter

查詢時基本上都會需要過濾條件
目前大概會使用到的如下
var builders = Builders.Filter;//建立查詢 
var filter = builders.Eq("age", 20);//過濾條件
var query = collection.Find(filter).ToList();//抓資料
條件如下
Eq等於
Ne不等於
Gt大於
Gte大於等於
Lt小於
Lte小於等於
Regex Like
In 存在裡面的
Nin 不存在裡面的
但通常條件不會這麼簡單
情境1.找年齡20~30歲
var filter = builders.Gte("age",20)  & builders.Lte("age", 30);
情境2.找年齡20~30歲或年齡50~60歲
var filter = builders.Gte("age",20)  & builders.Lte("age", 30);
filter = filter | builders.Gte("age", 50) & builders.Lte("age", 60);
情境3.找年齡20~30歲或年齡50~60歲且名字有林的
var filter = builders.Gte("age",20)  & builders.Lte("age", 30);
filter = filter | builders.Gte("age", 50) & builders.Lte("age", 60);
filter = filter & builders.Regex("Name", "林");
情境4.找年齡50、60、70歲
int[] agelist = new[] { 50, 60, 70 };
var filter = builders.In(x => x.age, agelist);
參考來源
Mongo C# driver - Building filter dynamically with nesting MongoDB C# Driver - Fastest way to perform an “IN” query on _id

2020年10月30日 星期五

MongoDB 05.備份與還原

1.前言
在網路上找就會有許多備份及還原的文章
mongodump
mongorestore
mongoexport
mongoimport
在命令提示字元中照貼語法都出現在列錯誤
'mongodump' 不是內部或外部命令、可執行的程式或批次檔。
後來檢查才發現根本沒這些執行檔阿
瀏覽官方文件,內容如下才發現原來我安裝的是目前最新的4.4版的,然後工具從4.4版後不包含在原本的裡面了
Starting with MongoDB 4.4, mongodump is now released separately from the MongoDB Server and uses its own versioning, with an initial version of 100.0.0. Previously, mongodump was released alongside the MongoDB Server and used matching versioning.
至官網下載MongoDB Database Tools
2.備份
-h: MongoDB連線IP或資訊
-port: Port
-d: 資料庫名稱
-o: 備份路徑資料夾
-u: 登入帳號
-p: 登入密碼
mongodump -h {host} -port {port} -d {yourdbname} -o {outputfloder} -u {username}-p {password}
mongodump -h localhost -port 27017 -d Happen -o d:\mongodb\bak -u Happen -p 7533967
完成後會在d:\mongodb\bak\Happen裡找到備份
3.還原
-d: 資料庫名稱
-u: 登入帳號
-p: 登入密碼
--drop: 以存在資料庫刪除原有的(注意)
mongorestore -d {yourdbname} --drop -o {outputfloder} -u {username}-p {password}
mongorestore -d Happen --droup  d:/mongodb/bak/happen -u Happen -p 7533967
參考來源
mongodump
[技術研究] 如何從遠端匯出MongoDB
5.備份及還原MongoDB(mongodump , mongorestore)

2020年10月29日 星期四

MongoDB 04.建立登入驗證

1.停用MongoDB Server服務
2.建立登入帳密
開啟命令提示字元,至安裝Mongodb目錄下輸入
mongo
>use yourdbname
>switched to db yourdbname
>db.createUser(
{
    user: "username",
    pwd: "password",
    roles: [ { role: "readWrite", db: "yourdbname" } ]
})
>Successfully added....
>db.auth('username','password')
1完成代表可以登入
0登入失敗
登入成功表示帳密無誤
3.設定mongod.cfg 找到
#security: 
改成
security:
    authorization: enabled


4.啟用MongoDB Server服務,寫程式即可使用上面的帳密登入,記得readWrite權限要開才能讀寫資料庫
5.Unable to authenticate using sasl protocol mechanism SCRAM-SHA-1
檢查一下連線字串是否正確,或是權限是否正確
mongodb://username:password@localhost:27017/dbname
PS也可直接使用工具建立帳密
參考來源
為 MongoDB 加上驗證機制
mongodb設定使用者名稱和密碼並用node連線
Built-In Roles Configuring MongoDB authentication