下載中轉加速器 VPSDownloader.NET(.NET Core 程式部署到 Linux 系統)

来源:https://www.cnblogs.com/weiliuhong/archive/2020/07/27/vpsdownloader-net-dotnet-core-linux.html
-Advertisement-
Play Games

使用 .NET Core WebAPI 實現一個 VPS 下載中轉(加速)器 VPSDownloader.NET,暨 .NET Core 程式部署到 Linux 系統。 ...


下載中轉加速器 VPSDownloader.NET(.NET Core 程式部署到 Linux 系統) 

獨立觀察員 2020 年 7 月 26 日

 

我們有的時候在下載外網的一些文件時會發現下載速度很慢,這個一方面是因為畢竟距離比較遠,或者需要跨越多種網路,另外還可能是被技術手段限制了。這時如果直接下載,那這個文件可真是跨越千山萬水,歷經百般阻撓才能到達我們的設備,不慢才怪呢。而如果我們有地理位置不在大陸(其實關鍵是接入的骨幹網路不一樣)—— 比如說香港 —— 的伺服器或者 VPS(虛擬伺服器),則可以想辦法中轉一下,因為這些伺服器提供商都有對網路進行優化,所以可能有幾率能加速下載。

之前按照網上的文章《vps-downloader 文件下載器》 ,本人在自己的 VPS 上搭建過了類似的加速下載器了(http://frps.dlgcy.com:9092/  ,此地址可能會失效,原作者的也失效了):

 

但由於原方案是使用 Python 構建的,而本人對 Python 不熟,說實話有點看不順眼 Python,加上基於修煉自己主攻語言(C#)的考慮,所以決定用 .NET Core WebAPI 來實現一個同樣的下載中轉(加速)器。

 

一、創建項目

我們使用宇宙第一 IDE —— Visual Studio 2019 —— 創建一個 ASP.NET Core Web 應用程式:

 

選擇 .NET Core 3.1 框架,API 模板:

 

模板預設會生成一個顯示天氣的控制器和相關的類,我們可以刪除這兩個文件並創建自己的控制器:

 

新建的控制器代碼很簡單,就是使用 HttpClient 獲取目標 url 的文件流,並重新返回二進位文件流,達到中轉下載的目的:

 

至此,無論使用 IIS Express 還是 程式自身的運行方式運行:

 

都是沒什麼問題的了:

 

Properties 中有個 launchSettings.json 配置文件,可以對啟動方式進行一些配置:

 

二、使用 Swagger 添加 API 文檔自動生成功能

Swagger 能針對我們開發好的 API 方法自動生成網頁版 API 文檔。通過 VS 中的 NuGet 進行安裝,NuGet 庫中有很多相似名稱的包,經過測試,使用以下三個包可以達到要求:

<ItemGroup>
    <PackageReference Include="Swashbuckle.AspNetCore.Swagger" Version="5.5.1" />
    <PackageReference Include="Swashbuckle.AspNetCore.SwaggerGen" Version="5.5.1" />
    <PackageReference Include="Swashbuckle.AspNetCore.SwaggerUi" Version="5.5.1" />
</ItemGroup>

 

這些包的項目地址為 https://github.com/domaindrivendev/Swashbuckle.AspNetCore ,裡面有使用方法講解。

 

簡單地說,要在 Startup.cs 中添加如下代碼:

//1、引入命名空間;
using Microsoft.OpenApi.Models;

//2、ConfigureServices 方法中添加;
services.AddMvc();
services.AddSwaggerGen(c =>
{
    c.SwaggerDoc("v1", new OpenApiInfo { Title = "My API", Version = "v1" });
});

//3、Configure 方法中添加;
app.UseSwagger();
app.UseSwaggerUI(c =>
{
    c.SwaggerEndpoint("/swagger/v1/swagger.json", "My API V1");
});

 

然後我們更改 launchSettings.json 配置文件中的初始啟動路徑為 swagger:

 

這時我們再啟動項目,就能看到 Swagger 的頁面了:

 

點擊 Try it out 按鈕可以進行調用測試,甚至在這種簡單的需求中可以直接當作前臺頁面使用。

 

三、項目發佈及 Linux 環境配置

(一)獨立模式

“獨立模式 “的意思就是將程式運行所需的依賴環境包和程式本身一起打包,這樣程式開箱即用,無需再在系統中安裝相關的運行環境(此處即為 .NET Core 運行時)。

我們在項目上右鍵–> 發佈,選擇發佈到文件夾,設置發佈選項(部署模式選 獨立,目標運行時選 linux-x64,勾上 生成單個文件):

 

保存配置後點擊發佈,在目標文件夾生成了項目同名文件(無尾碼),以及一些配置文件。由於選擇了生成單個文件,所以文件比較大(50+MB):

 

如果不勾上 “生成單個文件 “,則各種依賴文件釋放在外面,看著鬧心:

 

再來說說目標運行時,實際上可供選擇的有好幾個:

 

我的 VPS 是 CentOS 7 系統的,自然是在兩個 linux 首碼選項中選擇,那麼具體應該選擇哪一個呢?需要在VPS 中使用以下命令(uname -a)判斷:

[root@dlgcy VPSDownloaderNET]# uname -a
Linux xxx.com 3.10.0-1062.4.1.el7.x86_64 #1 SMP Fri Oct 18 17:15:30 UTC 2019 x86_64 x86_64 x86_64 GNU/Linux

 

發佈到本地成功之後,大家就可以八仙過海各顯神通地將這些文件放到 VPS 上的某個目錄了(推薦安裝寶塔面板),然後賦予可執行許可權並運行:

chmod +x ./VPSDownloader.NET
./VPSDownloader.NET​

 

運行成功:

 

(二)框架依賴模式

上面說的 “獨立模式 “不用在 Linux 系統中安裝運行環境,但發佈出來的文件大小相對於項目功能來說十分巨大,給部署帶來了不便。下麵我們來介紹 “框架依賴模式 “,顧名思義,發佈的程式不附帶運行環境,依賴於系統中安裝的運行環境,自然而然地,這樣發佈出來的程式大小將大大減少。

首先,我們需要安裝運行環境,微軟官方網址和介紹如下:

https://docs.microsoft.com/zh-cn/dotnet/core/install/linux-centos 

 

以 CentOS 7 為例:

# 1. 添加微軟包儲存庫;
sudo rpm -Uvh https://packages.microsoft.com/config/centos/7/packages-microsoft-prod.rpm
# 2. 安裝運行時;
sudo yum install aspnetcore-runtime-3.1

 

安裝好系統運行環境後,我們這次發佈時選擇 “框架依賴 “模式:

 

可以看到生成的主要運行文件只有 2+MB:

 

 四、修改監聽埠

(使用網路文章《.net core 修改網站啟動埠》的第 3 種方式:配置 json 文件)

即在項目中添加一個 host.json 配置文件:

{
    //"urls": "http://*:5000;https://*:5001",
    "urls": "http://*:5000"
}

 

註意生成的時候目錄中要出現該文件:

 

然後在 Program.cs 中配置使用:

 

文字版:

public static IHostBuilder CreateHostBuilder(string[] args)
{
    var config = new ConfigurationBuilder()
        .SetBasePath(Directory.GetCurrentDirectory())
        .AddJsonFile("host.json", optional: true)
        .Build();

    return Host.CreateDefaultBuilder(args)
        .ConfigureWebHostDefaults(webBuilder =>
        {
            webBuilder
                .UseStartup<Startup>()
                .UseConfiguration(config);
        });
}

 

一開始我也是帶上了 https 的配置:

 

但是在伺服器上運行時出錯了,好像是缺少證書:

 

所以乾脆只使用 http:

 

使用埠配置文件還解決了一個問題,那就是可以允許全部 IP(包括外網)進行訪問:

 

而如果是直接在之前提到的啟動配置文件中配置 “http://*:5000” 則會報錯。

 

另外,伺服器或 VPS 需要開放相關埠,推薦使用寶塔面板進行設置。

 

五、支持下載 https 協議地址的文件

先給出兩個供下載的文件,分別為 https 和 http 地址的:

https://nginx.org/download/nginx-1.16.0.tar.gz 

http://dlgcy.com/dlgcy/weixin_dlgcy_blog.png 

 

我們還是用 swagger 頁面來測試:

 

在參數 url 處填上下載地址後,點擊 Execute 按鈕: 

 

先是 https 的,出錯了:

 

再來 http 的,是能正常下載的:

 

然後我在本地測試,https 的也是可以下載的,說明是伺服器環境的問題:

 

經過百度得知,在 CentOS 7.x  HttpClient 訪問會出問題  The SSL connection could not be established, see inner exception

https://www.cnblogs.com/leoxjy/p/11235028.html 

按照上面鏈接給出的方法,最終下載核心代碼如下(添加了 HttpClientHandler):

/// <summary>
/// 通過 HttpClient 獲取另外站點的文件流,再輸出
/// </summary>
[HttpGet]
public async Task<IActionResult> Get(string url)
{
    if (string.IsNullOrWhiteSpace(url))
    {
        _logger.LogTrace("下載地址為空!");
        return Content("請在鏈接後跟上下載地址後再次訪問");
    }

    try
    {
        // 解決 CentOS7 Https 下載地址出錯的問題;
        var httpClientHandler = new HttpClientHandler
        {
            ServerCertificateCustomValidationCallback = (message, certificate2, arg3, arg4) => true
        };

        using HttpClient client = new HttpClient(httpClientHandler);
        var stream = await client.GetStreamAsync(url);
        return File(
            stream,
            "application/octet-stream", // 二進位流
            Path.GetFileName(url));
    }
    catch (Exception ex)
    {
        return Content($" 出錯了:{ex}");
    }
}

 

https 的可以下載了:

 

六、開機運行

方式一:開機後臺運行

使用如下組合命令即可在 Linux 系統中後臺運行:

nohup ./VPSDownloader.NET &​

 

輸出內容會轉到 nohup.out 文件中:

 

使用寶塔面板的 “開啟啟動管理 “插件可設置開機啟動:

 

方式二:開機自啟服務

創建啟動文件 Start.sh,輸入:

#! /bin/sh
cd /dlgcy/VPSDownloaderNET
nohup ./VPSDownloader.NET &

 

創建 VPSDownloader.NET.service,輸入

# VPSDownloader.NET.service
 
[Unit]
Description=VPSDownloader.NET Service
After=network.target
 
[Service]
User=root
Type=forking
ExecStartPre=/bin/sleep 10
ExecReload=/bin/kill -s HUP $MAINPID
ExecStop=/bin/kill -s QUIT $MAINPID
ExecStart=/dlgcy/VPSDownloaderNET/Start.sh
Restart=always
RestartSec=30
StartLimitInterval=20
StandardOutput=/dlgcy/VPSDownloaderNET/log
 
[Install]
WantedBy=multi-user.target

 

創建安裝服務腳本 InstallService.sh,輸入:

chmod +x ./VPSDownloader.NET
chmod +x ./Start.sh
touch ./log
cp ./VPSDownloader.NET.service /usr/lib/systemd/system/VPSDownloader.NET.service
 
systemctl daemon-reload
systemctl enable VPSDownloader.NET
systemctl start VPSDownloader.NET
systemctl status VPSDownloader.NET

 

將這三個文件傳到 VPS 上後(檢查一下上傳過程中文件有沒有被更改),運行如下命令:

[root@dlgcy ~]# cd /dlgcy/VPSDownloaderNET/
[root@dlgcy VPSDownloaderNET]# chmod +x ./InstallService.sh
[root@dlgcy VPSDownloaderNET]# ./InstallService.sh

 

執行結果:

 

可使用以下命令管理服務:

systemctl stop VPSDownloader.NET
systemctl start VPSDownloader.NET
systemctl status VPSDownloader.NET

 

七、後記 & 地址

由於這個基本只是打算自用,所以也未搭建前端頁面。建議大家要用的話可以自己搭建一個。下麵給出的測試地址不保證以後穩定和能訪問。

測試地址:http://frps.dlgcy.com:5000/swagger/index.html

發行版地址:https://gitee.com/dlgcy/VPSDownloader.NET/releases/v20200726

項目開源地址:https://gitee.com/dlgcy/VPSDownloader.NET

 

同步首發:

http://dlgcy.com/vpsdownloader-net-dotnet-core-linux/

微信訂閱號

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 接著前面, 看完構造函數前的後置處理器, 就到 doCreateBean 方法了. protected Object doCreateBean(final String beanName, final RootBeanDefinition mbd, final @Nullable Object[] ...
  • 又是好久沒有寫題解了。。。。。 1.題意分析: P2299是一道非常經典的圖論最短路練習題。 圖論最短路是圖論中非常重要的一個知識模塊,其主要演算法有Dijkstra,Bellman-Ford,SPFA和Floyd。在這片題解中我們著重介紹Dijkstra演算法。 2.演算法詳解: Dijkstra應該是 ...
  • 一、Servlet 1. 什麼是Servlet Servlet 是 JavaEE 規範之一,規範就是介面 Servlet 就 JavaWeb 三大組件之一,三大組件分別是:Servlet 程式、Filter 過濾器、Listener 監聽器 Servlet 是運行在伺服器上的一個 java 小程式, ...
  • 本系列將和大家分享面向對象23種設計模式中常用的幾種設計模式,本章主要簡單介紹下行為型設計模式。 ...
  • 都0202年了,不會還有人在用WPF吧,不會吧不會吧~什麼qt啊,electron啊,flutter啊好多東西要學啊,我還是繼續用WPF吧。因為其它的還不太會;繼續學習吧~ 期待WinUI3和“MAUI”-2021 1.周末沒加班,閑來沒事做;模仿個東西好了;在模仿中學習(各位大佬不要嘲諷我就是~) ...
  • 首次發表,不太會寫,那點乾貨上個分,廢話不多說,不懂多看 1 public void Publist() 2 { 3 ResultListData resultData = new ResultListData(); 4 BLL.basic_project bllspro = new BLL.bas ...
  • .net core 和.net framework上傳文件還是有一些區別的有很多註意的地方 .net framework 上傳文件用httppostedfilebase .net core 上傳文件用 IFormFile 下麵廢話不多說了,直接上代碼 控制器裡面寫 using System; usi ...
  • 一、簡介 ABP vNext 在 v 2.9.x 版本當中添加了 BLOB 系統,主要用於存儲大型二進位文件。ABP 抽象了一套通用的 BLOB 體系,開發人員在存儲或讀取二進位文件時,可以忽略具體實現,直接使用 IBlobContainer 或 IBlobContainer<T> 進行操作。官方的 ...
一周排行
    -Advertisement-
    Play Games
  • Timer是什麼 Timer 是一種用於創建定期粒度行為的機制。 與標準的 .NET System.Threading.Timer 類相似,Orleans 的 Timer 允許在一段時間後執行特定的操作,或者在特定的時間間隔內重覆執行操作。 它在分散式系統中具有重要作用,特別是在處理需要周期性執行的 ...
  • 前言 相信很多做WPF開發的小伙伴都遇到過表格類的需求,雖然現有的Grid控制項也能實現,但是使用起來的體驗感並不好,比如要實現一個Excel中的表格效果,估計你能想到的第一個方法就是套Border控制項,用這種方法你需要控制每個Border的邊框,並且在一堆Bordr中找到Grid.Row,Grid. ...
  • .NET C#程式啟動閃退,目錄導致的問題 這是第2次踩這個坑了,很小的編程細節,容易忽略,所以寫個博客,分享給大家。 1.第一次坑:是windows 系統把程式運行成服務,找不到配置文件,原因是以服務運行它的工作目錄是在C:\Windows\System32 2.本次坑:WPF桌面程式通過註冊表設 ...
  • 在分散式系統中,數據的持久化是至關重要的一環。 Orleans 7 引入了強大的持久化功能,使得在分散式環境下管理數據變得更加輕鬆和可靠。 本文將介紹什麼是 Orleans 7 的持久化,如何設置它以及相應的代碼示例。 什麼是 Orleans 7 的持久化? Orleans 7 的持久化是指將 Or ...
  • 前言 .NET Feature Management 是一個用於管理應用程式功能的庫,它可以幫助開發人員在應用程式中輕鬆地添加、移除和管理功能。使用 Feature Management,開發人員可以根據不同用戶、環境或其他條件來動態地控制應用程式中的功能。這使得開發人員可以更靈活地管理應用程式的功 ...
  • 在 WPF 應用程式中,拖放操作是實現用戶交互的重要組成部分。通過拖放操作,用戶可以輕鬆地將數據從一個位置移動到另一個位置,或者將控制項從一個容器移動到另一個容器。然而,WPF 中預設的拖放操作可能並不是那麼好用。為瞭解決這個問題,我們可以自定義一個 Panel 來實現更簡單的拖拽操作。 自定義 Pa ...
  • 在實際使用中,由於涉及到不同編程語言之間互相調用,導致C++ 中的OpenCV與C#中的OpenCvSharp 圖像數據在不同編程語言之間難以有效傳遞。在本文中我們將結合OpenCvSharp源碼實現原理,探究兩種數據之間的通信方式。 ...
  • 一、前言 這是一篇搭建許可權管理系統的系列文章。 隨著網路的發展,信息安全對應任何企業來說都越發的重要,而本系列文章將和大家一起一步一步搭建一個全新的許可權管理系統。 說明:由於搭建一個全新的項目過於繁瑣,所有作者將挑選核心代碼和核心思路進行分享。 二、技術選擇 三、開始設計 1、自主搭建vue前端和. ...
  • Csharper中的表達式樹 這節課來瞭解一下表示式樹是什麼? 在C#中,表達式樹是一種數據結構,它可以表示一些代碼塊,如Lambda表達式或查詢表達式。表達式樹使你能夠查看和操作數據,就像你可以查看和操作代碼一樣。它們通常用於創建動態查詢和解析表達式。 一、認識表達式樹 為什麼要這樣說?它和委托有 ...
  • 在使用Django等框架來操作MySQL時,實際上底層還是通過Python來操作的,首先需要安裝一個驅動程式,在Python3中,驅動程式有多種選擇,比如有pymysql以及mysqlclient等。使用pip命令安裝mysqlclient失敗應如何解決? 安裝的python版本說明 機器同時安裝了 ...