我有一个函数应用程序,它通过托管标识和实体框架连接到 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];
有任何指导如何排除或解决这个问题吗?
这对我有用。
我的
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创建支持请求