11

我计划使用 WebJobs 作为 NServiceBus 的轻量级替代品,但想首先验证例行 SQL Azure 数据库查询是否可以从触发的 WebJob 处理程序中进行?我的数据库访问将通过 EntityFrameworks。

这个 SO 线程表明 WebJobs 不支持 SQL 数据库,但我希望这只是意味着 SQL 数据库不能用作 WebJob 处理程序的触发机制?

Azure Web 作业 - 如何连接到 Azure MS SQL 数据库?

我还没有找到发出 SQL 数据库查询的 WebJob 示例,但是由于 WebJob 可以访问与主网站相同的应用程序配置,我认为可以提供数据库连接详细信息?

4

2 回答 2

10

Webjobs 是可以在 Azure 上运行的任何可执行文件(因此 .NET 程序可以正常运行)。触发机制是特定的,不能使用 SQL Azure,但您可以在 Web 作业本身的可执行代码中运行 SQL Azure 。

例如,此 webjob 在对 SQL Azure 数据库执行查询并将结果写入配置的存储容器中的文本文件之前,等待“testwebjobsqueue”上的消息“web-jobs-testing-sql”:

namespace AzureWebJobs
{
    class AzureSqlTest
    {
        static void Main()
        {
            JobHost host = new JobHost();
            host.RunAndBlock(); 
        }

        public static void SyndicateFiles([QueueInput("testwebjobsqueue")] string inputText, 
                            [BlobOutput("temp/WebJobs-log.txt")]TextWriter writer)
        {
            if (!inputText.StartsWith("web-jobs-testing-"))  
                return;

            writer.WriteLine(String.Format("Starting to do processing for " + inputText + " at {0}", DateTime.Now.ToShortTimeString()));
            string storageContainerName = ConfigurationManager.AppSettings["StorageContainerNameTemp"].ToLower();

            AzureStorageUtils.ConfigureStorage(storageContainerName);

            SQLTest sqlTest = new SQLTest();
            sqlTest.RunSqlQuery(inputText, writer);
            writer.WriteLine(String.Format("Syndication Finished at {0}", DateTime.Now.ToShortTimeString()));
        }
    }


    class SQLTest
    {
        public SQLTest()
        {

        }

        public void RunSqlQuery(string queueMessage, TextWriter writer)
        {
            if (queueMessage == "web-jobs-testing-sql")
            {
                string connectionString = "Server=tcp:YourDatabaseServerName.database.windows.net,1433;Database=YourDatabaseName;User ID=YourSQLAzureUserID;Password=YourStrongPassword;Trusted_Connection=False;Encrypt=True;Connection Timeout=30;";
                SqlConnection sqlConnection1 = new SqlConnection(connectionString);
                SqlCommand cmd = new SqlCommand();


                cmd.CommandText = "SELECT * FROM Users";
                cmd.CommandType = CommandType.Text;
                cmd.Connection = sqlConnection1;

                sqlConnection1.Open();

                using (SqlDataReader reader = cmd.ExecuteReader())
                {
                    // Data is accessible through the DataReader object here.
                    while (reader.Read())
                    {
                        writer.WriteLine(reader.GetValue(1).ToString());
                    }
                    reader.Close();
                }
                sqlConnection1.Close();
            }
        }
    }
}   

当然,最好将连接字符串、存储容器名称等存储在托管 Web 作业的网站的配置设置中(您可以在“配置”选项卡的“应用程序设置”和“连接字符串”部分中执行此操作' 在 azure 门户中,因此您在网站上可访问的文件中没有任何设置)。

于 2014-07-24T20:38:43.277 回答
1

我们还没有 SqlAzure 的触发器。我们会考虑通过开放可扩展性来开放它,以允许您根据不同的事件(例如 SQL Azure、文件系统观察程序等)触发函数。您可以共享可以在您的站点和 webjob 之间共享的 ConnectionString。以下帖子在 Azure 上的 WebJob 中捕获了此 Use connectionstring

于 2014-07-24T23:44:51.157 回答