Net5 WorkService继承Quarzt及Net5如何处理文件上传功能
这篇文章主要为大家展示了“Net5WorkService继承Quarzt及Net5如何处理文件上传功能”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“Net5WorkService继承Quarzt及Net5如何处理文件上传功能”这篇文章吧。
Net5 版本以Core为底层非framework框架的windowservice 服务。
在VS里叫WorkService 可以以CMD方式运行也可以以Windowservice方式运行,部署简单。
Program.cs如下,是关键配置和启动项
usingMicrosoft.Extensions.Hosting;usingQuartz;usingWorkerService.Common;usingWorkerService.Job;namespaceWorkerService{publicclassProgram{publicstaticvoidMain(string[]args){CreateHostBuilder(args).Build().Run();}publicstaticIHostBuilderCreateHostBuilder(string[]args)=>Host.CreateDefaultBuilder(args).UseWindowsService().ConfigureServices((hostContext,services)=>{#region原生workService//自定义调度//services.AddHostedService<Worker>();#endregion#regionquartz原始版本//这个版本triggerjobSchedule是唯一关联,不能一个组下多个任务//services.AddQuartz(q=>//{//q.UseMicrosoftDependencyInjectionScopedJobFactory();////Createa"key"forthejob//varjobKey=newJobKey("HelloTestJob");////RegisterthejobwiththeDIcontainer//q.AddJob<HelloTestJob>(opts=>opts.WithIdentity(jobKey));////Createatriggerforthejob//q.AddTrigger(opts=>opts//.ForJob(jobKey)//linktotheHelloWorldJob//.WithIdentity("HelloTestJob-trigger")//givethetriggerauniquename//.WithCronSchedule("0/1****?"));//runevery1seconds//});//services.AddQuartzHostedService(q=>q.WaitForJobsToComplete=true);#regionquarzt优化版本////Registerthejob,loadingtheschedulefromconfiguration//q.AddJobAndTrigger<HelloTestJob>(hostContext.Configuration,"0/1****?");//每秒运行一次//q.AddJobAndTrigger<HelloTestJob2>(hostContext.Configuration,"0/1****?");#region温湿度SF6红外图片上传services.AddQuartz(q=>{q.UseMicrosoftDependencyInjectionScopedJobFactory();//每秒0/1****?每小时00***?//Registerthejob,loadingtheschedulefromconfigurationq.AddJobAndTrigger<TemperatureJob>(hostContext.Configuration,"00***?");q.AddJobAndTrigger<SF6Job>(hostContext.Configuration,"00***?");q.AddJobAndTrigger<InfraredJob>(hostContext.Configuration,"00***?");});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); 设定定时启动的毫秒数就可以了
usingMicrosoft.Extensions.Hosting;usingMicrosoft.Extensions.Logging;usingSystem;usingSystem.IO;usingSystem.Threading;usingSystem.Threading.Tasks;namespaceWorkerService.Job.Test{publicclassWorker:BackgroundService{privatereadonlyILogger<Worker>_logger;publicWorker(ILogger<Worker>logger){_logger=logger;}protectedoverrideasyncTaskExecuteAsync(CancellationTokenstoppingToken){while(!stoppingToken.IsCancellationRequested){_logger.LogInformation("Workerrunningat:{time}",DateTimeOffset.Now);FileStreamstream=newFileStream(@"d:\aa.txt",FileMode.Create);//fileMode指定是读取还是写入StreamWriterwriter=newStreamWriter(stream);writer.WriteLine("123456"+DateTimeOffset.Now);//写入一行,写完后会自动换行writer.Write("abc");//写完后不会换行writer.WriteLine("ABC");writer.Close();//释放内存stream.Close();//释放内存awaitTask.Delay(1000,stoppingToken);}}}}
quartz 原始版本(program.cs代码截图)
在目前这个quartz 3.3.3 版本中好像不能一个Key 下多个Job集成作业。所以每个job需要一个一个注册。推荐使用优化版本
quarzt 优化版本(program.cs代码截图)
对原始版本进行了封装。在每一次调用的时候会注册新的唯一实例。
以下是帮助类
usingMicrosoft.Extensions.Configuration;usingQuartz;usingSystem;namespaceWorkerService.Common{publicstaticclassServiceCollectionQuartzConfiguratorExtensions{publicstaticvoidAddJobAndTrigger<T>(thisIServiceCollectionQuartzConfiguratorquartz,IConfigurationconfig,stringcronSchedule)whereT:IJob{//UsethenameoftheIJobastheappsettings.jsonkeystringjobName=typeof(T).Name;//TryandloadtheschedulefromconfigurationvarconfigKey=$"Quartz:{jobName}";//varcronSchedule=config[configKey];//Someminorvalidationif(string.IsNullOrEmpty(cronSchedule)){thrownewException($"NoQuartz.NETCronschedulefoundforjobinconfigurationat{configKey}");}//registerthejobasbeforevarjobKey=newJobKey(jobName);quartz.AddJob<T>(opts=>opts.WithIdentity(jobKey));quartz.AddTrigger(opts=>opts.ForJob(jobKey).WithIdentity(jobName+"-trigger").WithCronSchedule(cronSchedule));//usetheschedulefromconfiguration}}}
以下是Job
usingMicrosoft.Extensions.Logging;usingQuartz;usingSystem;usingSystem.IO;usingSystem.Threading.Tasks;namespaceWorkerService.Job.Test{[DisallowConcurrentExecution]publicclassHelloTestJob2:IJob{privatereadonlyILogger<HelloTestJob2>_logger;publicHelloTestJob2(ILogger<HelloTestJob2>logger){_logger=logger;}publicTaskExecute(IJobExecutionContextcontext){FileStreamstream=newFileStream(@"d:\aa1.txt",FileMode.Create);//fileMode指定是读取还是写入StreamWriterwriter=newStreamWriter(stream);writer.WriteLine("123456aaa"+DateTimeOffset.Now);//写入一行,写完后会自动换行writer.Write("abc");//写完后不会换行writer.WriteLine("ABC");writer.Close();//释放内存stream.Close();//释放内存returnTask.CompletedTask;}}}
程序会根据Corn 设定的运行时间定期在Task Execute(IJobExecutionContext context)方法内运行
然后就是蛮搞笑的,大伙都不用Net5 吗。写服务上传文件。遇到问题搜索NET5处理文件上传问题,居然都是空白的。 那我就只好自己写解决方案了。
客户端图片上传的HTTPHelper.cs部分代码如下
///<summary>///上传文件///</summary>///<paramname="url">请求地址</param>///<paramname="path">文件路径(带文件名)</param>///<returns></returns>publicstaticstringHttpPostFile(stringurl,stringpath){//设置参数HttpWebRequestrequest=WebRequest.Create(url)asHttpWebRequest;CookieContainercookieContainer=newCookieContainer();request.CookieContainer=cookieContainer;request.AllowAutoRedirect=true;request.Method="POST";stringboundary=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");intpos=path.LastIndexOf("\\");stringfileName=path.Substring(pos+1);//请求头部信息StringBuildersbHeader=newStringBuilder(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());StringBuilderbuilder=newStringBuilder($"Content-Disposition:form-data;name=\"subPath\"\r\n\r\ntmswechat");byte[]postHeaderBytestwo=Encoding.UTF8.GetBytes(builder.ToString());FileStreamfs=newFileStream(path,FileMode.Open,FileAccess.Read);byte[]bArr=newbyte[fs.Length];fs.Read(bArr,0,bArr.Length);fs.Close();StreampostStream=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();//发送请求并获取相应回应数据HttpWebResponseresponse=request.GetResponse()asHttpWebResponse;//直到request.GetResponse()程序才开始向目标网页发送Post请求Streaminstream=response.GetResponseStream();StreamReadersr=newStreamReader(instream,Encoding.UTF8);//返回结果网页(html)代码stringcontent=sr.ReadToEnd();returncontent;}
重点是服务端的接收,部分代码如下
try{varfiles=Request.Form.Files;if(files!=null){varfile=files[0];varlocation=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(varstream=newFileStream(location,FileMode.Create)){awaitfile.CopyToAsync(stream);result=1;}}//using(varreader=newStreamReader(Request.Body))//从身体里读取//{//varbody=awaitreader.ReadToEndAsync();//}}catch(Exceptione){throw;}
哪怕你用的是文件流上传,不是表单提交。但是你的文件依旧在Request.Form.Files 里!!!!
但你也可以通过Request.body 读到流
//using(varreader=newStreamReader(Request.Body))//从身体里读取//{//varbody=awaitreader.ReadToEndAsync();//}
以上是“Net5WorkService继承Quarzt及Net5如何处理文件上传功能”这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注亿速云行业资讯频道!
声明:本站所有文章资源内容,如无特殊说明或标注,均为采集网络资源。如若本站内容侵犯了原著者的合法权益,可联系本站删除。