使用.NET 6应用程序连接到通常通过GlobalProtect连接的Microsoft SQL Server数据库

watbbzwu  于 2022-12-26  发布在  .NET
关注(0)|答案(1)|浏览(277)

我在Azure Function应用程序中使用.NET 6、Azure Function版本4和SqlClient。
我有一个如下所示的连接字符串

Server=tcp:name.database.windows.net,1433;Initial Catalog=dbName;Persist Security Info=False;User ID=username;Password=password;MultipleActiveResultSets=True;Encrypt=True;TrustServerCertificate=False;Connection Timeout=120;

通常,我通过提供门户、用户名和密码来使用GlobalProtect访问此数据库。现在,我正在开发一个Azure Function应用程序,该应用程序将访问此数据库,但我收到此错误
System.Private.CoreLib:执行函数时出现异常:MyAzurefunction. Core .Net SqlClient数据提供程序:无法打开登录所请求的服务器“serverName”。不允许IP地址为“MyIpAddress”的客户端访问该服务器。若要启用访问,请使用Windows Azure管理门户或对master数据库运行sp_set_firewall_rule,以创建此IP地址或地址范围的防火墙规则。此更改最多可能需要五分钟才能生效。
我知道我得到这个错误,因为我的IP地址没有访问服务器,但我如何通过我的连接字符串连接到它?

guykilcj

guykilcj1#

我创建Azure SQL数据库。数据库的连接字符串:

Server=tcp:<serverName>.database.windows.net,1433;Initial Catalog=<database Name>;Persist Security Info=False;User ID=server;Password={your_password};MultipleActiveResultSets=False;Encrypt=True;TrustServerCertificate=False;Connection Timeout=30;

参考图片:

我在visual studio中用. net 6创建了函数应用程序。图片供参考:

我将其发布到Azure。图片供参考:

在已发布页面上选择椭圆(...)并选择管理Azure应用服务设置。参考图像:

在应用页面中单击"添加设置",添加设置名称。参考图片:

在sql_connection中,在Local节中为远程节输入sql db的连接字符串,单击从Local插入值。参考图像:

安装System.Data.SqlClient包在项目的管理Nuget包。我添加了下面的代码连接到SQL数据库:

using System.Data.SqlClient;
using System.Threading.Tasks;

[FunctionName("DatabaseCleanup")]
public static async Task Run([TimerTrigger("*/15 * * * * *")]TimerInfo myTimer, ILogger log)
{
    // Get the connection string from app settings and use it to create a connection.
    var str = Environment.GetEnvironmentVariable("sqldb_connection");
    using (SqlConnection conn = new SqlConnection(str))
    {
        conn.Open();
        var text = "UPDATE SalesLT.SalesOrderHeader " +
                "SET [Status] = 5  WHERE ShipDate < GetDate();";

        using (SqlCommand cmd = new SqlCommand(text, conn))
        {
            // Execute the command and log the # rows affected.
            var rows = await cmd.ExecuteNonQueryAsync();
            log.LogInformation($"{rows} rows were updated");
        }
    }
}

上述函数每15秒运行一次,根据发货日期更新Status列。
我在数据库防火墙设置中添加了我的IP地址。

启动15秒后,函数将运行。SalesOrderHeader表中更新的行数的输出:

通过这种方式,我连接到我的SQL数据库到我的函数应用程序。

相关问题