Azure Function App 8.0 隔离 - SQL 异常

问题描述 投票:0回答:1

我有一个函数应用程序,它通过托管标识和实体框架连接到 Azure SQL Server。一切都在本地进行。但我得到以下异常:

失败异常:Microsoft.Data.SqlClient.SqlException(0x80131904): 已成功与服务器建立连接,但随后出现 登录过程中发生错误。 (提供商:SSL 提供商, 错误:0 - 现有连接被远程强制关闭 主机。) ---> System.ComponentModel.Win32Exception (10054): 现有的 连接被远程主机强制关闭

这是我的连接字符串:

服务器=sql-xxx-test.database.windows.net;数据库=XXX-Dev;身份验证=活动 目录管理身份;加密=False;

Function App 在 8.0 中独立运行。 EF 是 8.0.4。

托管身份已添加到数据库:

CREATE USER [func-int-xxx-dev] FROM EXTERNAL PROVIDER;
ALTER ROLE db_datareader ADD MEMBER [func-int-xxx-dev];
ALTER ROLE db_datawriter ADD MEMBER [func-int-xxx-dev];

有任何指导如何排除或解决这个问题吗?

c# azure entity-framework-core azure-functions
1个回答
0
投票

这对我有用。

我的

connectionstring

"Server=tcp:<servername>.database.windows.net,1433;Initial Catalog=<databasename>;Encrypt=True;TrustServerCertificate=False;Connection Timeout=30;Authentication=Active Directory Managed Identity";

作为参考,请检查此文档

注意:-

  • 确保您的 IP 地址允许连接
  • 确保您使用的是最新版本的
    EntityFramework
    Microsoft.Data.SqlClient
  • 确保您已分配角色正确的托管身份。
  • 确保您使用的最低 TLS 版本 1.2

在 Azure Function 中启用托管标识。将使用您的函数名称创建一个企业应用程序服务主体。

使用查询分配角色。

DECLARE @USERNAME nvarchar(128)

SET @USERNAME = 'my-system-assign-identity-name'

BEGIN
    EXECUTE('CREATE USER "' + @USERNAME + '" FROM EXTERNAL PROVIDER');
    EXECUTE('ALTER ROLE db_datareader ADD MEMBER "' + @USERNAME + '"');
    EXECUTE('ALTER ROLE db_datawriter ADD MEMBER "' + @USERNAME + '"');
END

我的代码:

using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Azure.Functions.Worker;
using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.Logging;


namespace FunctionApp3
{
    public class Function
    {
        private readonly ILogger<Function> _logger;
        private readonly MyDbContext _context;

        public Function(ILogger<Function> logger, MyDbContext context)
        {
            _logger = logger;
            _context = context;
        }

        [Function("Function")]
        public async Task<IActionResult> Run([HttpTrigger(AuthorizationLevel.Anonymous, "get", "post")] HttpRequest req)
        {
            _logger.LogInformation("C# HTTP trigger function processed a request.");

            var data = await _context.Test.ToListAsync();

            // Process or log the fetched data
            foreach (var item in data)
            {
                Console.WriteLine($"Id: {item.Id}, Name: {item.Name}");
            }

            return new OkObjectResult("Welcome to Azure Functions!");
        }
    }
    public class MyDbContext : DbContext
    {
        public MyDbContext(DbContextOptions<MyDbContext> options) : base(options) { }
        public DbSet<Test> Test { get; set; }
    }

    public class Test
    {
        public int Id { get; set; }
        public string Name { get; set; }
    }
}

Program.cs
:

using FunctionApp3;
using Microsoft.Azure.Functions.Worker;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
using Microsoft.Extensions.Logging;
using Microsoft.EntityFrameworkCore;

var host = new HostBuilder()
    .ConfigureFunctionsWebApplication()
    .ConfigureServices(services =>
    {
        services.AddApplicationInsightsTelemetryWorkerService();
        services.ConfigureFunctionsApplicationInsights();
        services.AddDbContext<MyDbContext>(option => 
        {
            option.UseSqlServer("Server=tcp:<servername>.database.windows.net,1433;Initial Catalog=<databasename>;Encrypt=True;TrustServerCertificate=False;Connection Timeout=30;Authentication=Active Directory Managed Identity");
        });
    })
    .ConfigureLogging(logging =>
    {
        logging.Services.Configure<LoggerFilterOptions>(options =>
        {
            LoggerFilterRule defaultRule = options.Rules.FirstOrDefault(rule => rule.ProviderName
                == "Microsoft.Extensions.Logging.ApplicationInsights.ApplicationInsightsLoggerProvider");
            if (defaultRule is not null)
            {
                options.Rules.Remove(defaultRule);
            }
        });
    })
    .Build();

host.Run();

.csproj
:

<Project Sdk="Microsoft.NET.Sdk">
  <PropertyGroup>
    <TargetFramework>net8.0</TargetFramework>
    <AzureFunctionsVersion>v4</AzureFunctionsVersion>
    <OutputType>Exe</OutputType>
    <ImplicitUsings>enable</ImplicitUsings>
    <Nullable>enable</Nullable>
  </PropertyGroup>
  <ItemGroup>
    <FrameworkReference Include="Microsoft.AspNetCore.App" />
    <PackageReference Include="Microsoft.Azure.Functions.Worker" Version="1.20.1" />
    <PackageReference Include="Microsoft.Azure.Functions.Worker.Extensions.Http" Version="3.1.0" />
    <PackageReference Include="Microsoft.Azure.Functions.Worker.Extensions.Http.AspNetCore" Version="1.2.0" />
    <PackageReference Include="Microsoft.Azure.Functions.Worker.Sdk" Version="1.16.4" />
    <PackageReference Include="Microsoft.ApplicationInsights.WorkerService" Version="2.21.0" />
    <PackageReference Include="Microsoft.Azure.Functions.Worker.ApplicationInsights" Version="1.1.0" />
    <PackageReference Include="Microsoft.EntityFrameworkCore" Version="8.0.4" />
    <PackageReference Include="Microsoft.EntityFrameworkCore.SqlServer" Version="8.0.4" />
  </ItemGroup>
  <ItemGroup>
    <None Update="host.json">
      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
    </None>
    <None Update="local.settings.json">
      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
      <CopyToPublishDirectory>Never</CopyToPublishDirectory>
    </None>
  </ItemGroup>
  <ItemGroup>
    <Using Include="System.Threading.ExecutionContext" Alias="ExecutionContext" />
  </ItemGroup>
</Project>

Data

OUTPUT

日志流:

如果您仍然面临同样的错误,我会请求使用azure创建支持请求

© www.soinside.com 2019 - 2024. All rights reserved.