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

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

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

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代码截图)

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

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

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

以下是帮助类

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处理文件上传的文章就介绍到这了,更多相关Net5 WorkService 继承 Quarzt 内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • ASP.NET Core文件上传与下载实例(多种上传方式)

    前言 前段时间项目上线,实在太忙,最近终于开始可以研究研究ASP.NET Core了. 打算写个系列,但是还没想好目录,今天先来一篇,后面在整理吧. ASP.NET Core 2.0 发展到现在,已经很成熟了.下个项目争取使用吧. 正文 1.使用模型绑定上传文件(官方例子) 官方机器翻译的地址:https://docs.microsoft.com/en-us/aspnet/core/mvc/models/file-uploads 这里吐槽一下 - -,这TM的机器翻译..还不如自己看E文的..

  • asp.net大文件上传解决方案实例代码

    以ASP.NET Core WebAPI 作后端 API ,用 Vue 构建前端页面,用 Axios 从前端访问后端 API ,包括文件的上传和下载. 准备文件上传的API #region 文件上传 可以带参数 [HttpPost("upload")] public JsonResult uploadProject(IFormFile file, string userId) { if (file != null) { var fileDir = "D:\\aaa"

  • quarzt定时调度任务解析

    简介 Quarzt是一个项目中定时执行任务的开源项目,Quartz是OpenSymphony开源组织在Job scheduling领域又一个开源项目,它可以与J2EE与J2SE应用程序相结合也可以单独使用,这里我们介绍和spring整合的例子 因为Spring已经整合Quarzt,所以我们只需要配置一下即可. 下载jar包 可以直接去http://www.quartz-scheduler.org/ Quarzt的官方网站下载jar包 可以通过Maven来构建,记得引入Spring所需要的jar

  • ASP.NET Core实现多文件上传

    创建应用程序 打开VS 2017 --新建 ASP.NET Core Web 应用程序 --Web 应用程序(模型视图控制器) 程序名字.路径,默认即可 删除不必要的内容 打开HomeController.cs 文件,删除所有方法 打开Views/Home目录,删除所有文件 在应用程序中 新建 file 目录 开始编程 那么,现在来写程序,实现文件上传 第一步 文件上传界面 在HomeController 中新建一个方法 这个 Action 是上传文件的界面 public IActionResu

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

    Net5 版本以Core为底层非framework框架的windowservice 服务. 在VS里叫WorkService 可以以CMD方式运行也可以以Windowservice方式运行,部署简单. Program.cs如下,是关键配置和启动项 using Microsoft.Extensions.Hosting; using Quartz; using WorkerService.Common; using WorkerService.Job; namespace WorkerService

  • AjaxFileUpload+Struts2实现多文件上传功能

    本文重点给大家介绍AjaxFileUpload+Struts2实现多文件上传功能,具体实现代码大家参考下本文. 单文件和多文件的实现区别主要修改两点, 一是插件ajaxfileupload.js里接收file文件ID的方式 二是后台action是数组形式接收 1.ajaxFileUpload文件下载地址http://www.phpletter.com/Demo/AjaxFileUpload-Demo/ 2.引入jquery-1.8.0.min.js.ajaxFileUpload.js文件 3.文

  • Ajax 配合node js multer 实现文件上传功能

    说明 作为一个node 初学者,最近在做一个聊天软件,支持注册.登录.在线单人.多人聊天.表情发送.各种文件上传下载.增删好友.聊天记录保存.通知声开关.背景图片切换.游戏等功能,所以用到了multer 模块,经过各种查文档,做demo例子,终于成功实现单个文件上传功能,支持大部分文件格式上传,同时显示到网页上 效果 是不是有种微信即视感,没错,就是根据网页版微信来做的, 要实现整体效果的话,要配合css和html来做,前端初学者,第一次发博客,实在捉急,近期,将会将代码放到github上去,感

  • 使用jQuery.form.js/springmvc框架实现文件上传功能

    使用的技术有jquery.form.js框架, 以及springmvc框架.主要实现异步文件上传的同时封装对象,以及一些注意事项. 功能本身是很简单的,但是涉及到一些传递参数类型的问题.例如:jquery的ajax方法与jquery.form.js中的ajaxSubmit方法的参数,具体细节将在下一篇博客中分享. 重点: html表格三要素: action="fileUpload/fileUpload" method="post" enctype="mul

  • Spring实现文件上传功能

    本篇文章,我们要来做一个Spring的文件上传功能: 1. 创建一个Maven的web工程,然后配置pom.xml文件,增加依赖: <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> <version>1.0.2.RELEASE</version> </dep

  • 配置php.ini实现PHP文件上传功能

    昨天分享了在PHP网站开发中如何在php.ini中配置实现session功能的PHP教程,今天继续分享在利用PHP实现文件上传功能时几点关键php.ini的配置. 说到在php.ini中的文件上传的配置,其实在之前介绍PHP文件上传功能代码实例教程以及Jquery AjaxUpload实现文件上传功能代码实例教程时我都有所提及.PHP文件上传功能配置主要涉及php.ini配置文件中的upload_tmp_dir.upload_max_filesize.post_max_size等选项. php.

  • MVC中基于Ajax和HTML5实现文件上传功能

    引言 在实际编程中,经常遇到实现文件上传并显示上传进度的功能,基于此目的,本文就为大家介绍不使用flash 或任何上传文件的插件来实现带有进度显示的文件上传功能. 基本功能:实现带有进度条的文件上传功能 高级功能:通过拖拽文件的操作实现多个文件上传功能 背景 HTML5提供了一种标准的访问本地文件的方法--File API规格说明,通过调用File API 能够访问文件信息,也可以利用客户端来验证上传文件的类型和大小是否规范. 该规格说明包含以下几个接口来使用文件: File接口:具有文件的"读

  • Java中使用COS实现文件上传功能

    cos是O'Rrilly公司开发的一款用于HTTP上传文件的OpenSource组件 需要cos.jar,下载地址:http://www.servlets.com/cos/ cos上传文件很简单,比fileupload还简单:但是上传最大我试了试,是800多兆,超过直接崩溃: java.io.IOException: Posted content length of 1627105576 exceeds limit of 889192448 --->byte,800多M 只需一个servelt即

  • php实现网页常见文件上传功能

    用php实现网页常见的文件上传功能,供大家参考,具体内容如下 上传页面 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <!--上传文件 enctype="multipart/form-data"指

  • 使用nodejs+express实现简单的文件上传功能

    1.建立express项目 express -e nodejs-uploadfile 2.下载multer中间件 npm i multer or yarn multer 3.在routes/index.js中引用multer,由于还要使用到文件操作,还要引用fs模块,并指定文件上传目录 const multer = require('multer'); const fs = require('fs'); const UPLOAD_PATH = './uploads' 单文件上传: index.h

随机推荐