【C#生态园】C#任务调度库大比拼:选择最适合你项目的工具

news2024/9/25 21:27:30

提升任务管理效率:探索C#任务调度库的优势与适用场景

前言

在软件开发中,任务调度是一个常见的需求。C#作为一种流行的编程语言,在任务调度领域也有许多相关的库和工具。本文将介绍几个用于C#的任务调度库,包括Quartz.NET、Hangfire、FluentScheduler、NCrontab、TaskScheduler以及DurableTaskFramework,分别从简介、安装配置和API概览等方面进行介绍和比较。

欢迎订阅专栏:C#生态园

文章目录

  • 提升任务管理效率:探索C#任务调度库的优势与适用场景
    • 前言
    • 1. Quartz.NET:一个用于C#的任务调度库
      • 1.1 简介
        • 1.1.1 核心功能
        • 1.1.2 使用场景
      • 1.2 安装与配置
        • 1.2.1 安装指南
        • 1.2.2 基本配置
      • 1.3 API 概览
        • 1.3.1 任务调度设置
    • 2. Hangfire:一个用于C#的任务调度库
      • 2.1 简介
        • 2.1.1 核心功能
        • 2.1.2 使用场景
      • 2.2 安装与配置
        • 2.2.1 安装方法
        • 2.2.2 基本设置
      • 2.3 API 概览
        • 2.3.1 任务队列管理
        • 2.3.2 任务调度执行
    • 3. FluentScheduler:一个轻量级、易于使用的任务调度库
      • 3.1 简介
        • 3.1.1 核心功能
        • 3.1.2 使用场景
      • 3.2 安装与配置
        • 3.2.1 安装指南
        • 3.2.2 基本配置
      • 3.3 API 概览
        • 3.3.1 任务定义
        • 3.3.2 任务调度监控
    • 4. NCrontab:一个用于解析Cron表达式的库
      • 4.1 简介
        • 4.1.1 核心功能
        • 4.1.2 使用场景
      • 4.2 安装与配置
        • 4.2.1 安装指导
        • 4.2.2 基本配置
      • 4.3 API 概览
        • 4.3.1 Cron表达式解析
        • 4.3.2 时间计算
    • 5. TaskScheduler:一个用于实现自定义任务调度器的库
      • 5.1 简介
        • 5.1.1 核心功能
        • 5.1.2 使用场景
      • 5.2 安装与配置
        • 5.2.1 安装指南
        • 5.2.2 基本设置
      • 5.3 API 概览
        • 5.3.1 任务调度器创建
        • 5.3.2 任务执行策略
    • 6. DurableTaskFramework:一个可靠的分布式任务编排引擎
      • 6.1 简介
        • 6.1.1 核心功能
        • 6.1.2 使用场景
      • 6.2 安装与配置
        • 6.2.1 安装指南
        • 6.2.2 基本设置
      • 6.3 API 概览
        • 6.3.1 任务编排流程定义
        • 6.3.2 任务状态追踪
    • 总结

1. Quartz.NET:一个用于C#的任务调度库

Quartz.NET 是一个功能强大且灵活的开源任务调度库,能够在 .NET 应用程序中执行多种类型的作业,包括定时任务、延迟执行任务和基于日历的任务。

1.1 简介

1.1.1 核心功能

Quartz.NET 提供了灵活的任务调度功能,可以根据需求进行定时触发、延迟触发等,同时支持作业的持久化存储、集群部署等高级功能。

1.1.2 使用场景

Quartz.NET 可以被广泛应用于需要进行任务调度的 .NET 应用程序中,比如定时数据备份、定时邮件发送、周期性报表生成等场景。

1.2 安装与配置

1.2.1 安装指南

通过 NuGet 包管理器可以轻松地安装 Quartz.NET。在 Visual Studio 中打开 NuGet 包管理器控制台,并执行以下命令:

Install-Package Quartz
1.2.2 基本配置

在使用 Quartz.NET 之前,需要进行基本的配置,包括创建调度器、定义作业、配置触发器等。

1.3 API 概览

1.3.1 任务调度设置

在 Quartz.NET 中,可以通过 Job 和 Trigger 来进行任务调度的设置。下面是一个简单的示例,演示了如何使用 Quartz.NET 创建一个简单的定时任务。

using Quartz;
using Quartz.Impl;

class Program
{
    static async Task Main(string[] args)
    {
        // 创建调度器
        var schedulerFactory = new StdSchedulerFactory();
        var scheduler = await schedulerFactory.GetScheduler();

        // 开启调度器
        await scheduler.Start();

        // 定义作业
        IJobDetail job = JobBuilder.Create<HelloJob>()
            .WithIdentity("job1", "group1")
            .Build();

        // 定义触发器
        ITrigger trigger = TriggerBuilder.Create()
            .WithIdentity("trigger1", "group1")
            .StartNow()
            .WithSimpleSchedule(x => x
                .WithIntervalInSeconds(10)
                .RepeatForever())
            .Build();

        // 将作业与触发器关联到调度器
        await scheduler.ScheduleJob(job, trigger);
    }
}

public class HelloJob : IJob
{
    public async Task Execute(IJobExecutionContext context)
    {
        Console.WriteLine("Hello Quartz.NET!");
    }
}

以上代码创建了一个调度器,并定义了一个简单的作业 HelloJob,然后将其与触发器关联,实现了每隔10秒执行一次 Hello Quartz.NET! 的输出。

Quartz.NET 官网链接:Quartz.NET

以上是关于 Quartz.NET 的简单介绍和基本使用示例,希望对你有所帮助!

2. Hangfire:一个用于C#的任务调度库

Hangfire 是一个用于 C# 的开源任务调度库,它可以帮助开发人员轻松地在 .NET 应用程序中执行延迟任务、重复任务和后台任务。通过使用 Hangfire,开发人员可以摆脱编写传统的定时器代码或手动管理线程池的烦恼,而是专注于业务逻辑的实现。

2.1 简介

2.1.1 核心功能

Hangfire 提供了以下核心功能:

  • 后台任务调度
  • 定时任务执行
  • 可视化任务监控
  • 分布式任务处理
  • 防止任务丢失
2.1.2 使用场景

Hangfire 适用于需要处理异步任务、定时任务或后台任务的任何 C#/.NET 应用程序。常见的使用场景包括:

  • 发送电子邮件
  • 数据清理
  • 日志记录
  • 缓存刷新
  • 定期报告生成等

2.2 安装与配置

2.2.1 安装方法

Hangfire 可以通过 NuGet 包管理器来安装,在 Visual Studio 中搜索 Hangfire 并选择安装即可。

2.2.2 基本设置

安装完成后,需要对 Hangfire 进行基本的初始化设置。在应用程序启动时,通过以下代码进行配置:

using Hangfire;
using Microsoft.Owin;
using Owin;

[assembly: OwinStartup(typeof(YourNamespace.Startup))]

namespace YourNamespace
{
    public class Startup
    {
        public void Configuration(IAppBuilder app)
        {
            GlobalConfiguration.Configuration.UseSqlServerStorage("YourConnectionString");
            app.UseHangfireDashboard();
            app.UseHangfireServer();
        }
    }
}

2.3 API 概览

2.3.1 任务队列管理

Hangfire 提供了丰富的 API 来管理任务队列,例如添加任务到队列、删除队列中的任务、获取队列中的任务状态等。

以下是一个简单示例,演示如何向 Hangfire 添加一个后台任务:

BackgroundJob.Enqueue(() => Console.WriteLine("后台任务已执行"));

更多关于任务队列管理的 API 信息,请参考官方文档:Hangfire 任务队列管理

2.3.2 任务调度执行

除了任务队列管理外,Hangfire 还提供了灵活的任务调度执行功能,可以根据指定的时间表执行任务。

以下代码展示了一个每分钟执行一次的定时任务:

RecurringJob.AddOrUpdate(() => Console.WriteLine("这是一个定时任务"), Cron.Minutely);

更多关于任务调度执行的 API 信息,请参考官方文档:Hangfire 任务调度执行

3. FluentScheduler:一个轻量级、易于使用的任务调度库

3.1 简介

3.1.1 核心功能

FluentScheduler 是一个轻量级、易于使用的任务调度库,它允许开发人员轻松地定义任务和调度规则,并且提供了丰富的 API 来实现任务的管理和监控。

3.1.2 使用场景

FluentScheduler 可以被广泛应用于需要定期执行任务的场景,比如定时数据同步、定时报表生成、定时数据清理等。

3.2 安装与配置

3.2.1 安装指南

你可以通过 NuGet 来安装 FluentScheduler。在 Visual Studio 中打开 NuGet 包管理器控制台,执行以下命令完成安装:

Install-Package FluentScheduler
3.2.2 基本配置

为了开始使用 FluentScheduler,你需要在你的项目中创建一个继承自 Registry 的类,并在其中定义你的任务和调度规则。例如:

using FluentScheduler;

public class MyRegistry : Registry
{
    public MyRegistry()
    {
        Schedule<MyJob>().ToRunNow().AndEvery(2).Seconds();
    }
}

public class MyJob : IJob
{
    public void Execute()
    {
        // 执行你的任务逻辑
    }
}

然后在你的应用程序启动时初始化调度器并注册任务:

JobManager.Initialize(new MyRegistry());

3.3 API 概览

3.3.1 任务定义

在 FluentScheduler 中,你可以通过 Schedule 方法定义一个任务,并使用 ToRunNow、ToRunOnceIn、ToRunEvery、AndEvery 等方法来设置任务的执行时间和频率。下面是一个简单的示例:

public class MyRegistry : Registry
{
    public MyRegistry()
    {
        Schedule<MyJob>().ToRunNow().AndEvery(2).Seconds();
    }
}
3.3.2 任务调度监控

FluentScheduler 提供了丰富的 API 来监控任务的执行情况,比如获取任务的执行状态、暂停、恢复或者移除任务等操作。你可以通过 JobManager 来管理任务的生命周期。以下是一个简单的示例:

// 获取所有注册的任务
var allJobs = JobManager.AllSchedules;

// 暂停特定任务
JobManager.GetSchedule<MyJob>().Disable();

// 恢复特定任务
JobManager.GetSchedule<MyJob>().Enable();

// 移除特定任务
JobManager.RemoveJob<MyJob>();

以上就是关于 FluentScheduler 任务调度库的简要介绍和使用方法。更多信息,请访问 FluentScheduler GitHub 页面。

4. NCrontab:一个用于解析Cron表达式的库

NCrontab 是一个用于解析 Cron 表达式的 C# 库,它可以帮助开发人员在他们的应用程序中实现任务调度和时间计算功能。接下来将介绍 NCrontab 的简介、安装与配置以及 API 概览。

4.1 简介

4.1.1 核心功能

NCrontab 主要提供了对 Cron 表达式进行解析并生成相应的时间点,以便于开发人员能够按照特定的时间规则执行相应的任务。通过 NCrontab,用户可以轻松地创建和管理定时任务,并且支持复杂的时间规则设定。

4.1.2 使用场景

NCrontab 可以被广泛应用于需要进行任务调度和时间计算的场景,比如定时备份数据、定时发送邮件、定时清理缓存等。无论是在 Web 应用、后台服务还是桌面应用中,NCrontab 都能提供灵活而强大的时间规则处理功能。

4.2 安装与配置

4.2.1 安装指导

可以通过 NuGet 来安装 NCrontab,使用以下命令行进行安装:

Install-Package NCrontab

更多安装信息可参考 NCrontab NuGet 页面。

4.2.2 基本配置

安装完成后,在项目中引入 NCrontab 的命名空间即可开始使用,例如:

using NCrontab;

4.3 API 概览

4.3.1 Cron表达式解析

NCrontab 允许用户解析 Cron 表达式并生成对应的时间点。以下是一个简单的示例代码,根据 Cron 表达式创建一个定时器并获取未来几次触发的时间点。

var schedule = CrontabSchedule.Parse("*/15 * * * *");
var nextFiveOccurences = schedule.GetNextOccurrences(DateTime.Now, DateTime.Now.AddHours(1));

foreach (var time in nextFiveOccurences)
{
    Console.WriteLine(time);
}

更多关于 Cron 表达式解析的内容,请参考 NCrontab GitHub 页面。

4.3.2 时间计算

除了解析 Cron 表达式,NCrontab 还提供了时间计算的功能,例如判断某个时间点是否匹配某个 Cron 表达式。以下是一个简单的示例代码:

var schedule = CrontabSchedule.Parse("0 0 * * MON");
var occurrence = schedule.GetNextOccurrence(DateTime.Now);

if (occurrence.HasValue)
{
    Console.WriteLine("下一个周一的零点时间为:" + occurrence.Value);
}
else
{
    Console.WriteLine("无下一个匹配时间点");
}

以上是对 NCrontab 库的简单介绍和基本使用示例,更多详细信息请查阅NCrontab官方文档。

5. TaskScheduler:一个用于实现自定义任务调度器的库

5.1 简介

TaskScheduler 是一个用于实现自定义任务调度器的 .NET 库,它提供了灵活的方式来创建和管理定时任务,可以根据需求定义任务执行策略,并支持多种使用场景。

5.1.1 核心功能
  • 提供丰富的任务调度功能,包括定时执行、循环执行等。
  • 支持定义任务执行策略,如任务优先级、超时处理等。
  • 灵活的任务管理方式,可动态增删改查任务。
5.1.2 使用场景
  • 后台定时任务执行
  • 循环任务调度
  • 异步任务管理

5.2 安装与配置

5.2.1 安装指南

通过 NuGet 可以方便地安装 TaskScheduler 库,可以在 Visual Studio 中的 NuGet 包管理器中搜索并安装。

Install-Package TaskScheduler
5.2.2 基本设置

完成安装后,在项目中引入 TaskScheduler 的命名空间即可开始使用:

using TaskScheduler;

5.3 API 概览

5.3.1 任务调度器创建

可以通过 TaskSchedulerFactory 类来创建任务调度器,示例代码如下:

var scheduler = TaskSchedulerFactory.CreateScheduler();

更多关于任务调度器的创建信息,请参考官方文档

5.3.2 任务执行策略

TaskScheduler 提供了灵活的任务执行策略定义方式,可以根据需要实现自定义的任务执行逻辑。以下是一个简单的示例:

var task = new Task(() =>
{
    // 执行具体任务逻辑
});

var trigger = new TimeTrigger(TimeSpan.FromSeconds(30));
var policy = new ExecutionPolicy { Priority = TaskPriority.High };

scheduler.ScheduleTask(task, trigger, policy);

更多关于任务执行策略的详细信息,请参考官方文档

以上是对 TaskScheduler 库的简要介绍和部分 API 的使用示例,希望能够帮助到你。

6. DurableTaskFramework:一个可靠的分布式任务编排引擎

6.1 简介

DurableTaskFramework是一个由Microsoft开发的可靠的分布式任务编排引擎,可以帮助开发人员轻松管理和执行长时间运行的业务流程。

6.1.1 核心功能

DurableTaskFramework的核心功能包括:

  • 可靠的任务状态追踪
  • 支持长时间运行的任务编排
  • 分布式事务管理
  • 故障恢复与重试
6.1.2 使用场景

DurableTaskFramework适用于需要执行长时间运行的、具有复杂业务逻辑的任务,例如订单处理、工作流程管理等场景。

6.2 安装与配置

6.2.1 安装指南

通过NuGet包管理器可以很容易地安装DurableTaskFramework。在Visual Studio Package Manager控制台中执行以下命令:

Install-Package Microsoft.Azure.WebJobs.Extensions.DurableTask

官网链接:DurableTask NuGet Package

6.2.2 基本设置

在使用DurableTaskFramework之前,需要配置Azure存储以及Durable Task扩展。以下是基本设置的C#示例代码:

var config = new JobHostConfiguration();
config.UseStorageAccount(storageAccount);
config.UseDurableTask(new DurableTaskExtension());

6.3 API 概览

6.3.1 任务编排流程定义

DurableTaskFramework提供了丰富的API来定义任务编排流程。下面是一个简单的C#示例,演示如何定义一个简单的工作流程:

public static async Task RunOrchestrator(
    [OrchestrationTrigger] IDurableOrchestrationContext context)
{
    var outputs = new List<string>();

    // 并行执行多个子任务
    var parallelTasks = new List<Task<int>>();
    for (int i = 0; i < 5; i++)
    {
        Task<int> task = context.CallActivityAsync<int>("Hello", i.ToString());
        parallelTasks.Add(task);
    }
    await Task.WhenAll(parallelTasks);

    return outputs;
}

官网链接:DurableTaskFramework OrchestrationTrigger Attribute

6.3.2 任务状态追踪

使用DurableTaskFramework可以轻松跟踪任务的状态。以下是一个C#示例代码,演示如何在任务中跟踪状态并记录日志:

public static async Task<int> Hello([ActivityTrigger] string name, ILogger log)
{
    log.LogInformation($"Saying hello to {name}.");
    return await GetResultFromExternalService(name);
}

官网链接:DurableTaskFramework ActivityTrigger Attribute

通过DurableTaskFramework,开发人员可以轻松构建、管理和执行长时间运行的分布式任务,并实现故障恢复与重试,为企业级应用程序提供了强大的支持。

总结

本文对Quartz.NET、Hangfire、FluentScheduler、NCrontab、TaskScheduler和DurableTaskFramework这六个C#任务调度库进行了系统性的介绍和比较。每个库都有其独特的优势和适用场景,读者可以根据项目需求选择最适合的任务调度库。同时,也可以根据本文提供的安装配置和API概览信息,快速上手并应用于实际项目中。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2164832.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

基于Node.js+Express+MySQL+VUE实现的在线电影视频点播网站管理系统的设计与实现

1. 引言 随着互联网技术的快速发展和普及&#xff0c;人们获取信息的方式发生了巨大变化&#xff0c;其中在线视频点播服务因其便捷性和多样性而受到广泛欢迎。在线电影视频点播网站作为这一领域的代表&#xff0c;不仅需要满足用户观看需求&#xff0c;同时也需为管理员提供高…

架构设计读后有感——设计流程

架构也是有套路的 绝大部分的公司中&#xff0c;架构师都是技术人员的终极方向&#xff0c;是技术金字塔的顶端&#xff0c;那么普通人员要想走上这条路&#xff0c;需要掌握适当的方法&#xff0c;逐步完善架构 &#x1f3f9;1 有的放矢——识别复杂度 分析复杂性是设计架构的…

vscode 代码格式setting设置

{"editor.tabSize": 2,"eslint.validate": ["javascript", // 用eslint的规则检测js文件"vue","html","typescript","typescriptreact"],"editor.codeActionsOnSave": {"source.fixAll…

【NLP】daydayup 循环神经网络基本结构,pytorch实现

RNN 循环神经网络 循环神经网络&#xff08;Recurrent Neural Network&#xff0c;RNN&#xff09;是一种神经网络结构&#xff0c;专门用于处理序列数据。 RNN结构原理 RNN架构中&#xff0c;网络通过循环把信息从一个处理步骤传递到下一个&#xff0c;这个循环结构被称为隐…

10个强大的AI驱动售后服务,助力成功

目录 10个AI驱动售后服务 1. 预测性维护以减少停机时间2. 自动化客户支持3. 个性化产品推荐4. 情感分析以改进反馈管理5. AI驱动自助服务平台6. 主动客户沟通7. 智能保修管理8. AI增强服务团队培训9. 高级分析服务优化10. AI驱动忠诚度计划 利用AI提升售后服务体验 在当今竞争…

探索OpenAI的全新里程碑:o1模型

近期&#xff0c;人工智能领域迎来了一项重要突破——OpenAI发布了其最新的语言模型o1。作为一款专为解决复杂问题设计的新一代大语言模型&#xff08;LLM&#xff09;&#xff0c;o1标志着该公司在智能推理能力方面迈出了重要的一步。尽管这个新系统仍处于初步阶段&#xff0c…

分析二极管的交流响应(1)——直流分析,Q点的计算

二极管的直流电路分析我们可以用理想模型&#xff0c;恒压降模型和折线模型去近似分析&#xff0c;但是这些模型仅限于我们的信号是直流的情况。如果遇到交流信号&#xff0c;我们该如何去分析呢&#xff1f; 首先我们来理解Q点的概念&#xff1a; 看这个Q点里的“Q”是个什么…

【C++】C++中如何处理多返回值

十四、C中如何处理多返回值 本部分也是碎碎念&#xff0c;因为这些点都是很小的点&#xff0c;构不成一篇文章&#xff0c;所以本篇就是想到哪个点就写哪个点。 1、C中如何处理多个返回值 写过python的同学都知道&#xff0c;当你写一个函数的返回时&#xff0c;那是你想返回…

【Javascript】原生实现deep watch,使用proxy逐层建立数据监听

原理 使用 proxy对象处理数据&#xff0c;添加监听&#xff0c;然后递归再次添加直到全部添加完毕 代码 /*** 给对象递归建立数据监听&#xff0c;可以监测每一层的每个键的变化* * param {*} obj // 目标对象 * param {*} callback //回调。通过key处理对应的变化* param {…

机器学习EDA探查工具Pandas profiling

在最初的数据探查的时候&#xff0c;可以通过pandas的函数&#xff0c;以及matplotlib做图像绘图&#xff0c;这个工作比较重复和低效&#xff0c;所以pandas针对常用的数据列统计和展示&#xff0c;做了EDA工具profiling&#xff0c;可以自动帮助数据分析。 问题1&#xff1a…

java核心基础

文章目录 1. Java开发基础1.1 DOS常用命令:&#xff08;以MAC常用命令比较&#xff09;1.2 JVM、JRE、JDK之间的关系1.3 Java开发环境的搭建1.4 Java的注释&#xff0c;标识符、标识符的命名规范1.5 变量和常量的定义及初始化1.6 Java的运算符1.7 三大语句1.8 常用的类1.8.1 ja…

计算机前沿技术-人工智能算法-大语言模型-最新论文阅读-2024-09-21

计算机前沿技术-人工智能算法-大语言模型-最新论文阅读-2024-09-21 1. AIvril: AI-Driven RTL Generation With Verification In-The-Loop Authors: Mubashir ul Islam, Humza Sami, Pierre-Emmanuel Gaillardon, and Valerio Tenace AIVRIL: 人工智能驱动的RTL生成与验证内…

OpenAPI鉴权(二)jwt鉴权

一、思路 前端调用后端可以使用jwt鉴权&#xff1b;调用三方接口也可以使用jwt鉴权。对接多个三方则与每个third parth都约定一套token规则&#xff0c;因为如果使用同一套token&#xff0c;token串用可能造成权限越界问题&#xff0c;且payload交叉业务不够清晰。下面的demo包…

springBoot --> 学习笔记

文章目录 认识 SpringBoot第一个 SpringBoot 程序彩蛋 banner &#xff08;emmmmm&#xff0c;哈哈哈哈哈哈&#xff0c;牛逼&#xff01;&#xff09;SpringBoot 配置配置文件第一个 yaml 配置 成功案例yaml 存在 松散绑定 JSR 303 数据校验多环境配置以及文件位置访问静态资源…

教你制作一个二维码就能查分的系统

学生和家长对于成绩查询的需求日益增长。为了满足这一需求&#xff0c;很多学校和老师开始使用二维码查询系统&#xff0c;以提高效率和保护隐私。以下内容就是如何制作一个简单易用的成绩查询二维码系统的步骤&#xff1a; 1. 准备电子表格 老师需要准备一个包含学生成绩的电…

(已解决)vscode如何传入argparse参数来调试/运行python程序

文章目录 前言调试传入参数运行传入参数延申 前言 以前&#xff0c;我都是用Pycharm专业版的&#xff0c;由于其好像在外网的时候&#xff0c;不能够通过VPN来连接内网服务器&#xff0c;我就改用了vscode。改用了之后&#xff0c;遇到一个问题&#xff0c;调试或者运行python…

基于Qt5.12.2开发 MQTT客户端调试助手

项目介绍 该项目是一个基于 Qt 框架开发的桌面应用程序&#xff0c;主要用于与 MQTT 服务器进行连接和通信。通过该应用&#xff0c;用户可以连接到 MQTT 服务器&#xff0c;订阅主题、发布消息并处理接收到的消息。项目使用 QMqttClient 类来实现 MQTT 协议的客户端功能&…

第128集《大佛顶首楞严经》

《大佛顶如来密因修正了义诸菩萨万行首楞严经》。监院法师慈悲&#xff0c;诸位法师&#xff0c;诸位同学&#xff0c;阿弥陀佛&#xff01; 请大家打开讲义296面。 庚一、总示阴相&#xff08;分四&#xff1a;辛一、结前行阴尽相。辛二、正明识阴区宇。辛三、悬示识阴尽相。…

通过frp 免费内网穿透,端口转发

1.准备工作 (1)拥有一台有公网IP的服务器(系统可以是windows/macos/linux),服务器可以使用云厂商购买的服务器 (2)从下面链接下载最新版本的frp安装包,客户端和服务端是同一个tar包 https://github.com/fatedier/frp/releases 服务端机器A-有外网ip的作为服务端 服务端机器B-需…

前端接口415状态码【解决】

前端接口415状态码【解决】 一、概述 415状态码是HTTP协议中的一个标准响应状态码&#xff0c;代表“Unsupported Media Type”&#xff08;不支持的媒体类型&#xff09;。当客户端尝试上传或发送一个服务器无法处理的媒体类型时&#xff0c;服务器会返回这个状态码。这通常意…