在云计算时代,开发者越来越倾向于使用无服务器架构来构建应用,以减少对基础设施管理的负担。Azure Function是微软Azure提供的无服务器计算服务,允许开发者编写代码而无需管理底层的基础设施、应用依赖关系和其他所需资源。Azure Function 支持多种编程语言,如C#、Java、JavaScript、F#、Python或PHP,并且可以手动执行或自动调度执行。此外,还可以通过触发器来执行函数,触发器可以是另一个Azure服务,也可以是与Azure无关的任何服务。
Azure Function是一种轻量级的、事件驱动的计算服务,允许用户编写小段代码来响应各种事件。这些事件可以是HTTP请求、消息队列、定时任务等。Azure Function 可以自动管理扩展,开发者只需关注业务逻辑的实现。
本文将演示如何创建一个Azure Function,该函数每小时定时执行一次,从FTP服务器读取CSV文件,并将数据传递给CRM系统。
要创建一个函数,首先需要创建一个函数应用。如果不想使用现有的资源组和存储,可以创建新的。在Azure门户中打开函数应用并添加一个新函数。设置定时任务,使用cron表达式“0 0 12 * * *”来在每天午夜12点触发函数。
为了避免硬编码,可以将CRM连接字符串、FTP URL和凭据作为应用设置添加。例如:
以下是一个C#语言的Azure Function示例代码,用于从FTP服务器读取CSV文件并将其内容上传到CRM系统。
using System;
using System.Configuration;
using System.IO;
using System.Net;
using Microsoft.Azure.WebJobs;
using Microsoft.Azure.WebJobs.Host;
using Microsoft.Xrm.Sdk;
using Microsoft.Xrm.Tooling.Connector;
public static void Run(TimerInfo myTimer, TraceWriter log)
{
log.Info($"Execution Started. : {DateTime.Now}");
Stream fileStream = null;
string[] fileContentToWriteToCRM;
IOrganizationService org;
string ftpId = ConfigurationManager.AppSettings["FtpId"].ToString();
string ftpAddress = ConfigurationManager.AppSettings["ftpAddress"].ToString();
string ftpPassword = ConfigurationManager.AppSettings["ftpPassword"].ToString();
// Read Ftp File(s)
FtpWebRequest ftpReq = (System.Net.FtpWebRequest)System.Net.FtpWebRequest.Create(ftpAddress);
ftpReq.Credentials = new NetworkCredential(ftpId, ftpPassword);
ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;
ftpReq.EnableSsl = false;
WebResponse tmpRes = ftpReq.GetResponse();
fileStream = tmpRes.GetResponseStream();
// ProcessData
TextReader tmpReader = new StreamReader(fileStream);
var txtData = tmpReader.ReadToEnd();
fileContentToWriteToCRM = txtData.Split(new string[] { "\r\n" }, StringSplitOptions.RemoveEmptyEntries);
// CRM Data Posting
string connectionstring = ConfigurationManager.AppSettings["connectionstring"];
CrmServiceClient conn = new Microsoft.Xrm.Tooling.Connector.CrmServiceClient(connectionstring);
org = (IOrganizationService)conn.OrganizationWebProxyClient != null ? (IOrganizationService)conn.OrganizationWebProxyClient : (IOrganizationService)conn.OrganizationServiceProxy;
log.Info($"CRM connection established");
log.Info($"Looping to move data to CRM");
foreach (var row in fileContentToWriteToCRM)
{
var rowvalues = row.Split(',');
Entity lead = new Entity("lead");
lead.Attributes["subject"] = rowvalues[0].ToString();
lead.Attributes["firstname"] = rowvalues[1].ToString();
lead.Attributes["lastname"] = rowvalues[2].ToString();
var id = org.Create(lead);
log.Info($"Lead created in CRM with GUID : {id}");
}
log.Info($"Loop Ended moved all data to CRM");
}
由于代码使用了CRM SDK中的程序集,需要将这些添加到代码中。在Azure Function中,可以通过添加project.json文件来实现,然后添加NuGet包。
{
"frameworks": {
"net46": {
"dependencies": {
"Microsoft.CrmSdk.CoreAssemblies": "9.0.0.0",
"Microsoft.CrmSdk.XrmTooling.CoreAssembly": "9.0.0.7"
}
}
}
}