---
# System prepended metadata

title: dotnet 小筆記

---

dotnet 小筆記
===

## 安裝在CentOS

```
sudo rpm -Uvh https://packages.microsoft.com/config/centos/7/packages-microsoft-prod.rpm
```

aspnetcore-runtime 相依 dotnet-runtime
所以安裝 aspnetcore-runtime 時也會安裝 dotnet-runtime

3.1
```
yum install dotnet-sdk-3.1 -y
yum install aspnetcore-runtime-3.1 -y
yum install dotnet-runtime-3.1 -y
```
5.0
```
yum install dotnet-sdk-5.0 -y
yum install aspnetcore-runtime-5.0 -y
yum install dotnet-runtime-5.0 -y
```

## 安裝在Ubuntu
```
wget -q https://packages.microsoft.com/config/ubuntu/18.04/packages-microsoft-prod.deb
sudo dpkg -i packages-microsoft-prod.deb
sudo add-apt-repository universe
sudo apt-get install apt-transport-https
sudo apt-get update
sudo apt-get install dotnet-sdk-3.1
```
---

## 執行

#### debug (.csproj)
```
dotnet run --environment=Production --urls=http://localhost:5001
dotnet run --environment=Production --urls http://+:5001
dotnet run --urls http://+:5001
```
#### release (.dll)
```
set ASPNETCORE_ENVIRONMENT=Production
dotnet app.dll --server.urls "http://localhost:5101;http://*:5102"

dotnet app.dll --urls http://+:3412
```
#### vscode
自動產生
F1 > .NET: Generate Assets for Build and Debug
REF: https://blog.miniasp.com/post/2019/01/22/Configure-Tasks-and-Launch-in-VSCode-for-NET-Core
> lanuch.json
> 調整項目
> "serverReadyAction.uriFormat": "%s/swagger"
> "env.ASPNETCORE_URLS": "http://+:5001"
```
{
   "version": "0.2.0",
   "configurations": [
        {
            "name": ".NET Core Launch (web)",
            "type": "coreclr",
            "request": "launch",
            "preLaunchTask": "build",
            // If you have changed target frameworks, make sure to update the program path.
            "program": "${workspaceFolder}/WebAppCore/bin/Debug/netcoreapp3.1/WebAppCore.dll",
            "args": [],
            "cwd": "${workspaceFolder}/WebAppCore",
            "stopAtEntry": false,
            // Enable launching a web browser when ASP.NET Core starts. For more information: https://aka.ms/VSCode-CS-LaunchJson-WebBrowser
            "serverReadyAction": {
                "action": "openExternally",
                "pattern": "^\\s*Now listening on:\\s+(https?://\\S+)",                
                "uriFormat": "%s/swagger"
            },
            "env": {
                "ASPNETCORE_ENVIRONMENT": "Development",
                "ASPNETCORE_URLS": "http://+:5001"
            },
            "sourceFileMap": {
                "/Views": "${workspaceFolder}/Views"
            }
        },
        {
            "name": ".NET Core Attach",
            "type": "coreclr",
            "request": "attach",
            "processId": "${command:pickProcess}"
        }
    ]
}

"configurations": [
    ...
    "env": {
        "ASPNETCORE_ENVIRONMENT": "Development",
        "ASPNETCORE_URLS": "http://+:5001"
    },
```
> task.json
> ctrl + shift + B 可以進行編譯
> set group defualt build
```
{
    "version": "2.0.0",
    "tasks": [
        {
            "label": "build",
            "command": "dotnet",
            "type": "process",
            "args": [
                "build",
                "${workspaceFolder}/WebAppCore/WebAppCore.csproj",
                "/property:GenerateFullPaths=true",
                "/consoleloggerparameters:NoSummary"
            ],
            "problemMatcher": "$msCompile",
            "group": {
                "kind": "build",
                "isDefault": true
            }
        },
        {
            "label": "publish",
            "command": "dotnet",
            "type": "process",
            "args": [
                "publish",
                "${workspaceFolder}/WebAppCore/WebAppCore.csproj",
                "/property:GenerateFullPaths=true",
                "/consoleloggerparameters:NoSummary"
            ],
            "problemMatcher": "$msCompile"
        },
        {
            "label": "watch",
            "command": "dotnet",
            "type": "process",
            "args": [
                "watch",
                "run",
                "${workspaceFolder}/WebAppCore/WebAppCore.csproj",
                "/property:GenerateFullPaths=true",
                "/consoleloggerparameters:NoSummary"
            ],
            "problemMatcher": "$msCompile"
        }
    ]
}
```
---

## linux dotnet sample.service
```
[Unit]
Description=Sample Service

[Service]
# 工作目錄
WorkingDirectory=/var/sample
# 執行指令
ExecStart=/bin/dotnet sample.dll

# 自動重啟
Restart=always
RestartSec=10

# 環境參數
Environment=ASPNETCORE_ENVIRONMENT=Development
Environment=ASPNETCORE_URLS=https://localhost:50001;http://localhost:50000

[Install]
WantedBy=multi-user.target
```
> 先使用 which dotnet 查看 dotnet CLI 路徑

```
systemctl enable sample && systemctl start sample
```

## 使用nginx當反代轉發dotnet
```
# nginx conf

server {
    listen 		8090;
    server_name SERVER_IP;

    proxy_set_header Host $http_host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
	
	location / {
		root		C:/nginx/html/admin;
		index		index.html index.htm index.php;
	}
	
	location ~ ^/api {
        proxy_pass         https://127.0.0.1:50001;
        proxy_http_version 1.1;
        proxy_set_header   Upgrade $http_upgrade;
        proxy_set_header   Connection keep-alive;
        proxy_set_header   Host $host;
        proxy_cache_bypass $http_upgrade;
        proxy_set_header   X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header   X-Forwarded-Proto $scheme;
    }
	
}
```

---
## IIS deploy

### 設定 application pool
網站新增完成後，到應用程式集區，把 CLR 版本改為沒有 Managed 程式碼

### 設定 Environment
dotnet publish 後, 編輯 web.config, 增加 <PropertyGroup> 區段
```
<configuration>
	<location path="." inheritInChildApplications="false">
	<system.webServer>
		<handlers>
			<add name="aspNetCore" path="*" verb="*" modules="AspNetCoreModuleV2" resourceType="Unspecified" />
		</handlers>
		<aspNetCore processPath="dotnet" arguments=".\Xuenn.IBR.Web.Service.OBSports.dll" stdoutLogEnabled="false" stdoutLogFile=".\logs\stdout" hostingModel="inprocess">
			<!-- 增加此區塊 -->
                        <environmentVariables>
                            <environmentVariable name="ASPNETCORE_ENVIRONMENT" value="QAT" />
                        </environmentVariables>
		</aspNetCore>
	</system.webServer>
	</location>
</configuration>
```
---

### dotnet 4.X

#### build
    
```
msbuild .\src\Piper\Piper.csproj /p:Configuration=Debug;DeployOnBuild=true;DeployTarget=Package;_PackageTempDir=../../aaaaa
```
/p:DeployOnBuild=True;DeployTarget=Package;_PackageTempDir=...
    打包出來是可以直接佈署的結構, 不會有 _PublishedWebsites 的目錄

/p:OutputPath="..."
    會有 _PublishedWebsites 的目錄
    
#### deploy
```
MSDeploy.exe -source:package="package.zip" -dest:contentPath="c:\project\website" -verb:sync -disableLink:AppPoolExtension -disableLink:ContentExtension -disableLink:CertificateExtension -enableRule:DoNotDeleteRule -allowUntrusted
```