使用.NET Core 2.1的Azure WebJobs

WebJobs不是Azure和.NET中的新事物。 Visual Studio 2017中甚至还有一个默认的Azure WebJob模板,用于完整的.NET Framework。 但是,Visual Studio中以某种方式遗漏了.NET Core中WebJobs的类似模板。 在这篇文章中,我使用的是.NET Core 2.1来创建WebJobs。

在.NET Core中创建WebJob并不难,但你必须知道一些技巧,特别是如果你想使用一些.NET Core好特性,比如日志和DI。

在这篇文章中,我们将构建一个WebJob并使用Visual Studio,Azure门户和VSTS将其发布到Azure。

什么是WebJobs

WebJob是在App Service后台运行的程序。 它与您的Web应用程序在相同的环境中运行,无需额外费用。 也许你需要做一些每小时任务或每天凌晨1点做一些清理工作。 Azure Application Insights使用WebJob报告应用程序的统计信息。

WebJobs可以按小时或每天安排,但也可以触发。 触发器可以是文件上载或队列上的新消息。

WebJobs 对比 Functions

我经常在WebJobs和Azure Functions之间比较。 在某种程度上,Functions是WebJobs的后继者。 Functions(通常)是在Azure中运行的一小段代码,就像WebJobs一样,在某个事件中触发,包括HTTP触发器。

Functions通常是WebJobs的一个很好的替代品,但如果你已经有了一个Web应用程序,那么使用WebJob就可以了。 特别是当您想在WebJob和Web应用程序之间共享代码或设置,这也使部署非常容易,因为它们在相同的上下文中运行。

创建一个Storage账户

在我们继续之前,先让我们先处理一下。 WebJob需要Azure Storage账户。 我将快速引导您完成创建过程。

在Azure中,找到“Storage Azure( 存储帐户)”并添加一个。 您必须选择一个在Azure中唯一的名称。 除此之外,您可以保留默认值。

一旦你的 Storage Account就绪,选择它并找到您的“Access keys(访问密钥)”。 我们稍后需要的两个连接字符串之一。

创建WebJob

前面已经说过,完整的.NET Framework有一个WebJob模板。 我建议你看看。 首先创建一个ASP.NET Web应用程序,然后添加一个新的WebJob。 如果您尝试立即创建WebJob,则会收到错误消息,指出项目需要先保存(尽管它确实创建了WebJob)。

这边文章写的是.NET Core的WebJob。 首先,创建一个ASP.NET Core Web应用程序,然后将新的.NET Core Console应用程序项目添加到您的解决方案中。

我们需要做的第一件事是从NuGet安装Microsoft.Azure.WebJobs包。 我们还应该安装Microsoft.Azure.WebJobs.Extensions。 这些库的最新稳定版本依赖于完整的.NET Framework,因此我们将需要3.0.0-beta5版本(在撰写本文时),它与.NET Core完全兼容。

我们需要的其他NuGet包是Microsoft.Extensions.Options.ConfigurationExtensions(它还提供了我们还需要的Microsoft.Extensions.Options包),Microsoft.Extensions.DependencyInjection和Microsoft.Extensions.Logging.Console。 请确保安装这些软件包的2.1.0版本,因为.NET Core 2.1中似乎存在一个错误,导致您无法使用包含修补程序版本的软件包,例如2.1.1。

添加到Program.cs文件

我们需要做的下一件事是更改我们的Program.cs文件。 如果您使用.NET Framework模板创建了WebJob,则只需复制并粘贴在那里生成的Program.cs文件(您可能需要更改命名空间)。

640?wx_fmt=png

添加配置和依赖

您会用到.NET Core里面好的特性,比如日志和DI。 默认情况下,Console App不具备任何功能,但您可以自行添加。

640?wx_fmt=png

接下来,创建一个appsettings.json文件并将“复制到输出目录”属性设置为“始终复制”。 appsettings.json文件应该有两个连接字符串,如Program.cs模板文件中所述。 这些是我们之前创建的存储帐户连接字符串。

640?wx_fmt=png

接下来我们需要的是一个自定义的IJobActivator,可用于将依赖项注入到我们的类中。 它需要在Program类的JobHostConfiguration上设置。

640?wx_fmt=png

添加Trigger(触发器)

之后,创建一个类并将其命名为Functions(就像在WebJob模板中一样)。 Functions类将包含WebJob的实际代码。

当然,我们需要添加一个触发器。 这与完整的.NET Framework不同。 毕竟,模板使用静态方法,这使得DI无法实现。 说到DI,请注意我们还将Functions类本身添加到DI容器中。

为简单起见,我们将使用TimerTrigger,它由所谓的CRON表达式触发。 这只是意味着它在某一分钟,小时,一天等时触发。在这个例子中,它会触发每一分钟。

我们还需要在JobHostConfiguration上配置计时器。

640?wx_fmt=png

var config = new JobHostConfiguration();
config.JobActivator = new JobActivator(services.BuildServiceProvider());
config.UseTimers();

运行示例

如果您正确地执行了所有操作,或者如果您正在从GitHub运行我的代码,那么您现在应该能够运行控制台应用程序。 如果您在例外情况下中断或者您正在观看“输出”窗口,您可能会注意到很多StorageExceptions。 不要担心它们,忽略它们。 这是WebJobs库中的一个错误,不会影响您的程序。 您的触发器可能需要一分钟才会消失,所以要有一点耐心。

如果您转到Azure存储帐户,您应该看到两个Blob容器,“azure-jobs-host-output”和“azure-webjobs-hosts”。 这里有很多东西,但你可以忽略它。 我发现我的WebJob触发器由于某种原因不会消失,删除Blob容器通常会有所帮助。 显然,存储在那里的某些状态在重新添加和删除WebJobs时并不总是正确处理掉。

 

发布到Azure

我们要做的下一件事是将WebJob部署到Azure。为了运行WebJob,需要一些可以用来运行的可执行脚本。支持许多文件类型,但对于我们Windows用户来说,使用exe,cmd,bat或PowerShell文件。

控制台应用程序曾经是一个exe文件,但在.NET Core中,它会生成一个我们需要手动启动的常规DLL文件。因此,创建一个文件并将其命名为“run.cmd”并确保它以UTF-8编码没有BOM(您可以使用Notepad ++之类的东西来检查)。它只需要一行代码,即“dotnet NetCoreWebJob.WebJob.dll”。这会运行您的控制台应用。确保将文件的“复制到输出目录”设置为“始终复制”。

最后一件事,由于某种原因,Azure WebJobs需要WebJob的所有依赖项,这意味着我们用来构建它的所有.NET Core包。您可以通过编辑csproj文件并将“<CopyLocalLockFileAssemblies> true </ CopyLocalLockFileAssemblies>”添加到第一个<PropertyGroup>(在“<TargetFramework>”下面)来完成此操作。

在我们部署WebJob之前,我们需要部署我们的Web应用程序。右键单击ASP.NET项目,然后单击“发布...”。只需按照向导操作,Visual Studio就会为您部署您的应用程序。您可以创建新的Web应用程序或选择现有的应用程序。此步骤并非严格必要,因为您可以托管独立的WebJobs,但这应该是熟悉的,它为您提供了我们可以用于WebJob的App Service。

使用Visual Studio发布

使用Visual Studio部署WebJobs应该很容易。事实上,你可能已经知道如何做到这一点(尽管不这样做)。右键单击WebJob项目,然后单击“发布...”。以下向导看起来很像我们刚刚做的Web应用程序的发布。您可以选择“选择现有”并选择我们刚创建的Azure Web应用程序。

不幸的是,微软以最糟糕的方式搞砸了这个功能。 Visual Studio将使用与项目相同的名称部署WebJob,即“NetCoreWebJob.WebJob”,除了dot是WebJob名称中的非法字符!这搞砸了我的项目非常糟糕我不得不手动编辑它以使我的解决方案再次运行。

所以这就是你做的。在向导开始时,您可以选择新的或现有的App Service,单击“立即发布”旁边的箭头,然后选择“创建配置文件”。现在,您可以先在设置中更改WebJob的名称,然后再进行部署。确保您没有选择“删除目的地的其他文件”,否则您将删除您的网络应用程序。

现在,浏览到Azure门户并查找您的Web应用程序。你会在菜单中找到“WebJobs”。你会看到你的WebJob,但它没有做任何事情。您需要通过选择它并单击“运行”来手动运行它。状态应更新为“正在运行”。您现在可以查看日志以确定它确实有效。您可能会看到有关连接字符串的错误,但您可以忽略它们。如果您切换输出,您仍然会看到一个日志写入控制台,让您知道它的工作原理!如果您没有立即看到日志,请尝试等待一两分钟,不要忘记手动刷新输出。

640?wx_fmt=png

Azure WebJobs图

使用Azure Portal发布

添加新的WebJob时,您需要填写一些选项。 您可以组成一些名称,将类型设置为“已触发”,将触发器设置为“手动”。 你的选择是一个“连续”WebJob,它只是运行和关闭(除非你在你的应用程序中实现了无限循环); 以及“预定”触发的工作,这基本上就是我们所拥有的,除非我们自己实施了计划。

“文件上传”需要一些解释。 在这里,您可以上传包含WebJob的zip文件。 因此,请转到Visual Studio并构建您的解决方案。 然后转到WebJob项目的输出文件夹,例如“MyProject \ bin \ [Debug | Release] \ netcoreapp2.1”,并将该文件夹中的所有内容放入zip文件中。 然后在新WebJob的“文件上传”中选择它。

640?wx_fmt=png

添加 WebJob

Azure需要几秒钟才能创建您的WebJob,因此请在刷新之前保持刷新。 之后,您必须再次手动启动它,您可以查看日志。

使用VSTS发布

最终,我们希望将我们的WebJob添加到VSTS中的CI / CD管道中。 不幸的是,这个功能并不是即拿即用的。 幸运的是,这也不是很困难。

当您在Azure门户中时,找到App Service的“App Service Editor(预览)”。 这使您可以浏览App Service中的所有文件。 我们注意到的一件事是您的WebJob位于“App_Data \ jobs \ triggered \ [WebJob名称]”中。 由于您的WebJob实际上只是WebJob项目构建的输出,因此只需将WebJob文件复制到App_Data即可。

640?wx_fmt=png

WebJob文件位置 

 

构建

所以去VSTS并创建一个新版本。选择存储库,分支,然后选择“ASP.NET Core”作为模板。我们只需要在这里改变两件事。我们需要更改现有的“发布”任务并添加新的“.NET Core”任务来发布我们的WebJob。

将现有发布任务的名称更改为“发布Web应用程序”,取消选中“发布Web项目”复选框,然后输入“项目路径”,即“** / NetCoreWebJob.csproj”。此外,取消选中“Zip Published Projects”和“Add project name to publish path”复选框,因为它们最终会破坏我们的版本。

之后,创建一个新的.NET Core任务,将“Command”设置为“publish”,并将任务名称更改为“Publish web job”。再次,取消“发布Web项目”并设置“项目路径”,即“** / NetCoreWebJob.WebJob.csproj”。再次,不要压缩已发布的项目或将项目名称添加到发布路径。这里的最后一步是“Arguments”字段,可以从其他发布步骤复制/粘贴,除了我们要添加一点:“ - configuration BuildConfigurationoutput(BuildConfiguration)−output(build。 artifactstagingdirectory)\ App_Data文件\ \作业引发\ WebJobVSTS”。


VSTS WebJob构建

发布

最后,但并非最不重要的是,发布。 在VSTS中创建新版本,选择“Azure App Service部署”模板并填写空白,这是工件和环境中的Azure设置。 因为我们没有压缩我们的构建,所以我们只需要更改一个设置。 在“部署Azure应用程序服务”任务是“包或文件夹”设置,其默认值为“[...] / * .zip”,显然不起作用。 而是使用浏览器(带有“...”的按钮)并选择您的drop文件夹。

保存,点击新版本并选择最新版本。 如果一切顺利,您应该在Azure门户中看到新的WebJob!

结束语

喜欢这篇文章就转载吧!不要直接copy过去哦!原文地址和源代码:使用.NET Core 2.1的Azure WebJobs

原文地址:https://www.cnblogs.com/bruceday/p/9606725.html

.NET社区新闻,深度好文,欢迎访问公众号文章汇总 http://www.csharpkit.com

640?wx_fmt=jpeg

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

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

相关文章

.NET Core中的CSV解析库

感谢本篇首先特别感谢从此启程兄的《.NetCore外国一些高质量博客分享》, 发现很多国外的.NET Core技术博客资源, 我会不定期从中选择一些有意思的文章翻译总结一下。.NET Core中的CSV解析库本篇博客来源于.NET Core Totorials的《CSV Parsing In .NET Core》。背景介绍对于初级…

为什么要使用Entity Framework

本文介绍从DDD(Domain-Driven Design[领域驱动设计])的角度来说说为什么要使用Entity Framework(以下都会简称为EF)&#xff0c;同时也看出类似Drapper之类的简陋ORM不足的地方。设想业务都是大家知晓的权限管理&#xff0c;实体类如下。读到这里&#xff0c;请先思考一下&…

Tarjan算法

Tarjan算法可以应用在求解 强连通分量&#xff0c;缩点&#xff0c;桥&#xff0c;割点&#xff0c;双连通分量&#xff0c;LCA等 关于文章目录强连通分量代码题目tarjan求割点割点概念流程代码&#xff1a;求无向图的割边&#xff0f;桥理解&#xff1a;代码&#xff1a;强连通…

Ocelot简易教程(一)之Ocelot是什么

简单的说Ocelot是一个用.NET Core实现并且开源的API网关技术。可能你又要问了&#xff0c;什么是API网关技术呢&#xff1f;Ocelot又有什么特别呢&#xff1f;我们又该如何集成到我们的asp.net core程序中呢&#xff1f;下面我会通过一些列通俗易懂的教程来为大家讲解。今天的这…

如何在你的项目中集成 CAP【手把手视频教程】

前言之前录制过一期关于CAP的视频&#xff0c;但是由于当时是直播时录制的视频&#xff0c;背景音比较杂所以质量有点差。这次的视频没有直播&#xff0c;直接录制的&#xff0c;视频质量会好很多&#xff0c;第一遍录制完成之后发现播放到一半没有声音&#xff0c;所以又重新录…

【Splay】文艺平衡树(金牌导航 Splay-2)

#文艺平衡树 金牌导航 Splay-2 题目大意 给你一个1~n的序列&#xff0c;然后对序列的区间做若干次翻转&#xff0c;问你最后的序列 输入样例 5 3 1 3 1 3 1 4输出样例 4 3 2 1 5数据范围 1⩽n,m⩽105,1⩽l⩽r⩽n1\leqslant n,m\leqslant 10^5,1\leqslant l\leqslant r \l…

.net core实践系列之短信服务-Sikiro.SMS.Api服务的实现

前言本篇会继续讲解Sikiro.SMS.Job服务的实现&#xff0c;在我写第一篇的时候&#xff0c;我就发现我当时设计的架构里Sikiro.SMS.Job这个可以选择不需要&#xff0c;而使用MQ代替。但是为了说明调度任务使用实现也坚持写了下。后面会一篇针对架构、实现优化的讲解。源码地址&a…

Drainage Ditches POJ1273

Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 93263 Accepted: 36174试题链接 文章目录Description题意&#xff1a;题解&#xff1a;代码&#xff1a;Dinic做法EK做法Description Every time it rains on Farmer John’s fields, a pond forms over Bessie’…

P2756 飞行员配对方案问题【网络流24题】

P2756 飞行员配对方案问题 文章目录题目背景题解&#xff1a;代码&#xff1a;题目背景 第二次世界大战期间&#xff0c;英国皇家空军从沦陷国征募了大量外籍飞行员。由皇家空军派出的每一架飞机都需要配备在航行技能和语言上能互相配合的两名飞行员&#xff0c;其中一名是英国…

大数据分析中使用关系型数据库的关键点

相当一部分大数据分析处理的原始数据来自关系型数据库&#xff0c;处理结果也存放在关系型数据库中。原因在于超过99%的软件系统采用传统的关系型数据库&#xff0c;大家对它们很熟悉&#xff0c;用起来得心应手。在我们正式的大数据团队&#xff0c;数仓&#xff08;数据仓库H…

图论复习——最小生成树MST

知识点 MST的构造 Boruvka算法常用于解决这类问题&#xff1a;给你n个点&#xff0c;每个点有点权&#xff0c;任意两个点之间有边权&#xff0c;边权为两个点权用过某种计算方式得出&#xff0c;求最小生成树。动图 MST上的确定性和存在性问题 最小生成树的两个性质&#xf…

Ocelot简易教程(二)之快速开始1

Ocelot是为.net core量身定做的&#xff0c;目前是基于 netstandard2.0进行构建的。.NET Core 2.1中如何使用呢&#xff1f;安装NuGet package使用nuget安装Ocelot及其依赖项。您需要创建一个netstandard2.0项目并将其Package安装到项目中。然后按照下面的“启动”和“ 配置”节…

P2761 软件补丁问题

文章目录题目描述题解&#xff1a;代码&#xff1a;添加链接描述题目描述 T 公司发现其研制的一个软件中有 n 个错误&#xff0c;随即为该软件发放了一批共 m 个补丁程序。每一个补丁程序都有其特定的适用环境&#xff0c;某个补丁只有在软件中包含某些错误而同时又不包含另一些…

Xamarin中国技术社区及BXUG官网上线啦

Xamarin中国技术社区及BXUG官网为.NET开发者提供移动跨平台技术学习的园地&#xff0c;为Xamarin及.NET技术达人提供展示分享的舞台&#xff0c; 为企业CTO等技术负责人提供跨平台移动应用解决方案的交流平台&#xff01;网址链接&#xff1a;http://bxug.bopoda.cn/Xamarin中国…

用python将图片转换成二值图像

大创项目是图像识别&#xff0c;第一个任务是将一个图片转换成二值图像 之前用过python的numpy和turtle&#xff0c;这次要用到图像库PIL的类Image&#xff0c;也算是刚刚从零开始学起 整体效果&#xff08;用01串表示图像&#xff09; 原理很简单&#xff1a;将图片中黑色…

.Net Core SignalR 初体验

前言Asp.Net SignalR已经出来很久了&#xff0c;但是一直没有静下心来好好看看。昨天花了几个小时的时间看了下。首先借鉴了官方文档&#xff0c;如何搭建一个SignalR的Demo。参考文章&#xff1a;https://docs.microsoft.com/zh-cn/aspnet/core/tutorials/signalr?viewaspnet…

CF1251F-Red-White Fence【NTT】

前言 刚开始看错题推了半天的生成函数 正题 题目链接:https://www.luogu.com.cn/problem/CF1251F 题目大意 nnn个白色木板&#xff0c;kkk个红色木板&#xff0c;给出这些木板的高度&#xff0c;木板排成一排形成栅栏。栅栏要求只有一个红色木板且在红色木板左边单调升&…

图论复习——dfs树,点双,边双,强连通分量

知识点 dfs树 对一个图运行 dfs 算法&#xff0c;每个点uuu的父亲定义为第一次遍历uuu时的前驱结点&#xff0c;若无则为根。 无向图的 dfs树 没有横叉边。 有向图的 dfs树 横叉边方向唯一&#xff0c;总是从后访问的点指向先访问的点。 dfs树详解 tarjan 点双 定义&#…

【点分治】Tree(luogu 4178/金牌导航 点分治-1)

Tree luogu 4178 金牌导航 点分治-1 题目大意 给出一棵树&#xff0c;问你书中路径长度小于等于k的点对个数有多少个 输入样例 5 1 2 3 1 3 1 1 4 2 3 5 1 4输出样例 8数据范围 1⩽N⩽41041\leqslant N \leqslant 4\times 10^41⩽N⩽4104 解题思路 对于该树&#xff0…

均分纸牌问题

均分纸牌有三种情况&#xff1a;线性&#xff0c;环形&#xff0c;二维 文章目录线性题目描述思路&#xff1a;代码&#xff1a;环形题目描述思路代码线性 题目描述 P1031 均分纸牌 有N堆纸牌&#xff0c;编号分别为1,2,…,N。每堆上有若干张&#xff0c;但纸牌总数必为N的倍…