iis服务器助手广告广告
返回顶部
首页 > 资讯 > 精选 >Net5 WorkService继承Quarzt及Net5如何处理文件上传功能
  • 822
分享到

Net5 WorkService继承Quarzt及Net5如何处理文件上传功能

2023-06-29 06:06:44 822人浏览 安东尼
摘要

这篇文章主要为大家展示了“Net5 WorkService继承Quarzt及Net5如何处理文件上传功能”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“Net5 WorkSer

这篇文章主要为大家展示了“Net5 WorkService继承Quarzt及Net5如何处理文件上传功能”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“Net5 WorkService继承Quarzt及Net5如何处理文件上传功能”这篇文章吧。

Net5 版本以Core为底层非framework框架windowservice 服务。

Net5 WorkService继承Quarzt及Net5如何处理文件上传功能

Net5 WorkService继承Quarzt及Net5如何处理文件上传功能

Net5 WorkService继承Quarzt及Net5如何处理文件上传功能

在VS里叫WorkService 可以以CMD方式运行也可以以Windowservice方式运行,部署简单。

Net5 WorkService继承Quarzt及Net5如何处理文件上传功能

Program.cs如下,是关键配置和启动项

using Microsoft.Extensions.Hosting;using Quartz;using WorkerService.Common;using WorkerService.Job;namespace WorkerService{    public class Program    {        public static void Main(string[] args)        {                        CreateHostBuilder(args).Build().Run();        }            public static IHostBuilder CreateHostBuilder(string[] args) =>            Host.CreateDefaultBuilder(args).UseWindowsService()                .ConfigureServices((hostContext, services) =>                {                    #region  原生work Service                    //自定义调度                    //services.AddHostedService<Worker>();                    #endregion                    #region quartz 原始版本                    //这个版本    trigger  job Schedule 是唯一关联,不能一个组下多个任务                    //services.AddQuartz(q =>                    //{                    //    q.UseMicrosoftDependencyInjectionScopedJobFactory();                    //    // Create a "key" for the job                    //    var jobKey = new JobKey("HelloTestJob");                    //    // ReGISter the job with the DI container                    //    q.AddJob<HelloTestJob>(opts => opts.WithIdentity(jobKey));                    //    // Create a trigger for the job                    //    q.AddTrigger(opts => opts                    //        .ForJob(jobKey) // link to the HelloWorldJob                    //        .WithIdentity("HelloTestJob-trigger") // give the trigger a unique name                    //        .WithCronSchedule("0/1 * * * * ?")); // run every 1 seconds                    //});                    //services.AddQuartzHostedService(q => q.WaitForJobsToComplete = true);                    #region quarzt 优化版本                    //    // Register the job, loading the schedule from configuration                    //    q.AddJobAndTrigger<HelloTestJob>(hostContext.Configuration, "0/1 * * * * ?");//每秒运行一次                    //    q.AddJobAndTrigger<HelloTestJob2>(hostContext.Configuration, "0/1 * * * * ?");                    #region  温湿度 SF6 红外图片上传                                 services.AddQuartz(q =>                    {                        q.UseMicrosoftDependencyInjectionScopedJobFactory();                        //每秒 0/1 * * * * ?   每小时  0 0 * * * ?                        // Register the job, loading the schedule from configuration                        q.AddJobAndTrigger<TemperatureJob>(hostContext.Configuration, "0 0 * * * ?");                        q.AddJobAndTrigger<SF6Job>(hostContext.Configuration, "0 0 * * * ?");                        q.AddJobAndTrigger<InfraredJob>(hostContext.Configuration, "0 0 * * * ?");                    });                    services.AddQuartzHostedService(q => q.WaitForJobsToComplete = true);                });    }   }

原始的Host.CreateDefaultBuilder(args) 需要增加 .UseWindowsService() 支持 对windowservice

quarzt 在 NET5的nuget 中叫Quartz.Extensions.Hosting

services.AddHostedService<Worker>(); 是原始的windows定时任务版本

代码如下, 在await Task.Delay(1000, stoppingToken); 设定定时启动的毫秒数就可以了

using Microsoft.Extensions.Hosting;using Microsoft.Extensions.Logging;using System;using System.IO;using System.Threading;using System.Threading.Tasks;namespace WorkerService.Job.Test{    public class Worker : BackgroundService    {        private readonly ILogger<Worker> _logger;        public Worker(ILogger<Worker> logger)        {            _logger = logger;        }        protected override async Task ExecuteAsync(CancellationToken stoppingToken)        {            while (!stoppingToken.IsCancellationRequested)            {                _logger.LogInfORMation("Worker running at: {time}", DateTimeOffset.Now);                FileStream stream = new FileStream(@"d:\aa.txt", FileMode.Create);//fileMode指定是读取还是写入                StreamWriter writer = new StreamWriter(stream);                writer.WriteLine("123456"+ DateTimeOffset.Now);//写入一行,写完后会自动换行                writer.Write("abc");//写完后不会换行                writer.WriteLine("ABC");                writer.Close();//释放内存                stream.Close();//释放内存                await Task.Delay(1000, stoppingToken);            }        }    }}

quartz 原始版本(program.cs代码截图)

Net5 WorkService继承Quarzt及Net5如何处理文件上传功能

在目前这个quartz 3.3.3 版本中好像不能一个Key 下多个Job集成作业。所以每个job需要一个一个注册。推荐使用优化版本

quarzt 优化版本(program.cs代码截图)

对原始版本进行了封装。在每一次调用的时候会注册新的唯一实例。

Net5 WorkService继承Quarzt及Net5如何处理文件上传功能

以下是帮助类

using Microsoft.Extensions.Configuration;using Quartz;using System;namespace WorkerService.Common{    public static class ServiceCollectionQuartzConfiguratorExtensions    {        public static void AddJobAndTrigger<T>(            this IServiceCollectionQuartzConfigurator quartz,            IConfiguration config, string cronSchedule)            where T : IJob        {            // Use the name of the IJob as the appsettings.JSON key            string jobName = typeof(T).Name;            // Try and load the schedule from configuration            var configKey = $"Quartz:{jobName}";            //var cronSchedule = config[configKey];            // Some minor validation            if (string.IsNullOrEmpty(cronSchedule))            {                throw new Exception($"No Quartz.net Cron schedule found for job in configuration at {configKey}");            }            // register the job as before            var jobKey = new JobKey(jobName);            quartz.AddJob<T>(opts => opts.WithIdentity(jobKey));            quartz.AddTrigger(opts => opts                .ForJob(jobKey)                .WithIdentity(jobName + "-trigger")                .WithCronSchedule(cronSchedule)); // use the schedule from configuration        }    }}

以下是Job

using Microsoft.Extensions.Logging;using Quartz;using System;using System.IO;using System.Threading.Tasks;namespace WorkerService.Job.Test{    [DisallowConcurrentExecution]    public class HelloTestJob2 : IJob    {        private readonly ILogger<HelloTestJob2> _logger;        public HelloTestJob2(ILogger<HelloTestJob2> logger)        {            _logger = logger;        }        public Task Execute(IJobExecutionContext context)        {            FileStream stream = new FileStream(@"d:\aa1.txt", FileMode.Create);//fileMode指定是读取还是写入            StreamWriter writer = new StreamWriter(stream);            writer.WriteLine("123456aaa" + DateTimeOffset.Now);//写入一行,写完后会自动换行            writer.Write("abc");//写完后不会换行            writer.WriteLine("ABC");            writer.Close();//释放内存            stream.Close();//释放内存            return Task.CompletedTask;        }    }}

程序会根据Corn 设定的运行时间定期在Task Execute(IJobExecutionContext context)方法内运行

然后就是蛮搞笑的,大伙都不用Net5 吗。写服务上传文件。遇到问题搜索NET5处理文件上传问题,居然都是空白的。 那我就只好自己写解决方案了。

客户端图片上传的HttpHelper.cs部分代码如下

/// <summary>        /// 上传文件        /// </summary>        /// <param name="url">请求地址</param>        /// <param name="path">文件路径(带文件名)</param>        /// <returns></returns>        public static string HttpPostFile(string url, string path)        {            // 设置参数            HttpWEBRequest request = WebRequest.Create(url) as HttpWebRequest;            CookieContainer cookieContainer = new CookieContainer();            request.CookieContainer = cookieContainer;            request.AllowAutoRedirect = true;            request.Method = "POST";string boundary = DateTime.Now.Ticks.ToString("X"); // 随机分隔线            request.ContentType = "multipart/form-data;charset=utf-8;boundary=" + boundary;            byte[] itemBoundaryBytes = Encoding.UTF8.GetBytes("\r\n--" + boundary + "\r\n");            byte[] endBoundaryBytes = Encoding.UTF8.GetBytes("\r\n--" + boundary + "--\r\n");            int pos = path.LastIndexOf("\\");            string fileName = path.Substring(pos + 1);            //请求头部信息            StringBuilder sbHeader = new StringBuilder(string.Format("Content-Disposition:form-data;name=\"file\";filename=\"{0}\"\r\nContent-Type:application/octet-stream\r\n\r\n", fileName));            byte[] postHeaderBytes = Encoding.UTF8.GetBytes(sbHeader.ToString());            StringBuilder builder = new StringBuilder($"Content-Disposition:form-data;name=\"subPath\"\r\n\r\ntmswechat");            byte[] postHeaderBytestwo = Encoding.UTF8.GetBytes(builder.ToString());            FileStream fs = new FileStream(path, FileMode.Open, FileAccess.Read);            byte[] bArr = new byte[fs.Length];            fs.Read(bArr, 0, bArr.Length);            fs.Close();            Stream postStream = request.GetRequestStream();            postStream.Write(itemBoundaryBytes, 0, itemBoundaryBytes.Length);            postStream.Write(postHeaderBytes, 0, postHeaderBytes.Length);            postStream.Write(bArr, 0, bArr.Length);            postStream.Write(itemBoundaryBytes, 0, itemBoundaryBytes.Length);            postStream.Write(postHeaderBytestwo, 0, postHeaderBytestwo.Length);            postStream.Write(endBoundaryBytes, 0, endBoundaryBytes.Length);            postStream.Close();            //发送请求并获取相应回应数据            HttpWebResponse response = request.GetResponse() as HttpWebResponse;            //直到request.GetResponse()程序才开始向目标网页发送Post请求            Stream instream = response.GetResponseStream();            StreamReader sr = new StreamReader(instream, Encoding.UTF8);            //返回结果网页(html)代码            string content = sr.ReadToEnd();            return content;        }

重点是服务端的接收,部分代码如下

try                    {                    var files = Request.Form.Files;                    if (files != null)                    {                        var file = files[0];                                        var location = System.AppDomain.CurrentDomain.SetupInformation.ApplicationBase + $"Image\\" + file.FileName;                        if (!Directory.Exists(System.AppDomain.CurrentDomain.SetupInformation.ApplicationBase + $"Image\\")) //判断上传文件夹是否存在,若不存在,则创建                        {                            Directory.CreateDirectory(System.AppDomain.CurrentDomain.SetupInformation.ApplicationBase + $"Image\\"); //创建文件夹                        }                        using (var stream = new FileStream(location, FileMode.Create))                        {                            await file.CopyToAsync(stream);                            result = 1;                        }                    }                    //using (var reader = new StreamReader(Request.Body))//从身体里读取                    //{                    //    var body = await reader.ReadToEndAsync();                                           //}                    }                    catch (Exception e )                    {                        throw;                    }

哪怕你用的是文件流上传,不是表单提交。但是你的文件依旧在Request.Form.Files 里!!!!

但你也可以通过Request.body 读到流

//using (var reader = new StreamReader(Request.Body))//从身体里读取//{// var body = await reader.ReadToEndAsync();//}

以上是“Net5 WorkService继承Quarzt及Net5如何处理文件上传功能”这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注编程网精选频道!

--结束END--

本文标题: Net5 WorkService继承Quarzt及Net5如何处理文件上传功能

本文链接: https://www.lsjlt.com/news/322948.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • c++中函数返回值的类型是由什么决定的
    在 c++ 中,函数返回值类型由其函数原型的类型决定,包括:函数原型指定返回值类型:在函数名称后跟冒号,再跟返回值类型。默认返回值类型为 int:如果不指定返回值类型,默认类型为 int...
    99+
    2024-05-14
    c++
  • 在c++中,什么叫函数的返回值
    在 c++ 中,函数只能返回一个值。解决方法:引用传递、结构体或类、out 参数。没有返回值的函数可以使用 void 类型,表示不返回任何值。 什么是 C++ 中函数的返回值? 在 C...
    99+
    2024-05-14
    c++
  • c++中static的作用和用法
    c++ 中的 static 关键字用于声明静态变量、函数或类成员,使其在程序生命周期内存在或与类的每个实例关联。具体用法如下:静态变量:在函数外声明,仅创建一份副本,在程序启动时初始化且...
    99+
    2024-05-14
    c++
  • static在c和c++中的区别
    static关键字在c和c++中用于控制变量的生命周期和作用域。在c中,它延长局部变量和限制全局变量的作用域。在c++中,它还用于定义类成员变量和函数、命名空间中的变量和函数,以及函数内...
    99+
    2024-05-14
    c语言 c++ 作用域
  • c++中a++与++a的区别
    c++ 中 a++ 和 ++a 区别:后缀递增 a++ 先返回原始值,再递增;前缀递增 ++a 先递增,再返回递增后的值。 C++ 中 a++ 与 ++a 的区别 在 C++ 中,a+...
    99+
    2024-05-14
    c++
  • if else在c++中的用法
    在 c++ 中,if else 语句根据条件执行不同代码块的语法为:if (condition) { } else { }。它可用于:检查数字是否为正数根据条件执行嵌套 if els...
    99+
    2024-05-14
    c++
  • struct在c和c++中的区别
    c和c++中struct的区别包括:c中成员默认公开访问,c++中默认私有访问。c++可以在struct定义中初始化成员,c中不允许。c++支持成员函数,c不支持。c++不支持匿名str...
    99+
    2024-05-14
    c++
  • c++中的所有函数都是传值调用吗
    函数调用类型可分为传值调用和引用调用,默认采用传值调用,传值调用中形参接收实参副本,引用调用中形参接收实参引用,对形参进行的修改也会影响实参。 C++中的函数调用类型 C++中,函数调...
    99+
    2024-05-14
    c++
  • c++中ifdef的用法
    c++ 中的 #ifdef 预处理器指令用于根据预定义宏是否存在来编译或不编译代码块。它的语法是 #ifdef ,其作用包括:检查宏是否存在,如果宏已定义,则编译其后的代码块;实现条件编...
    99+
    2024-05-14
    c++
  • c++中的函数调用有哪几种方式?它们有什么区别
    c++ 中的函数调用方式有 4 种:值传递(复制实参值,不影响实参)、引用传递(传递实参地址,修改形参值会修改实参)、指针传递(传递实参指向的内存地址,修改指向的值会影响实参)、rval...
    99+
    2024-05-14
    c++
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作