我在Visual Studio中创建了一个最小的ASP.NET Core Web API项目。然后将其部署到Azure Web App Service,以便能够远程“获取”结果。在本地,/weatherforecast示例数据和Azure SQL数据运行良好,但是,在发布后,只有weatherforecast可以访问,但/Members不可访问。
Program.cs
using Microsoft.Data.SqlClient;
using Microsoft.AspNetCore.OpenApi;
using Microsoft.EntityFrameworkCore;
var builder = WebApplication.CreateBuilder(args);
// Add services to the container.
var app = builder.Build();
// Configure the HTTP request pipeline.
app.UseHttpsRedirection();
var summaries = new[]
{
"Freezing", "Bracing", "Chilly", "Cool", "Mild", "Warm", "Balmy", "Hot", "Sweltering", "Scorching"
};
app.MapGet("/weatherforecast", () =>
{
var forecast = Enumerable.Range(1, 5).Select(index =>
new WeatherForecast
(
DateOnly.FromDateTime(DateTime.Now.AddDays(index)),
Random.Shared.Next(-20, 55),
summaries[Random.Shared.Next(summaries.Length)]
))
.ToArray();
return forecast;
});
string connectionString = Environment.GetEnvironmentVariable("AZURE_SQL_CONNECTIONSTRING");
app.MapGet("/Members", () => {
var rows = new List<string>();
using var conn = new SqlConnection(connectionString);
conn.Open();
var command = new SqlCommand("SELECT * FROM WHATEVER", conn);
using SqlDataReader reader = command.ExecuteReader();
if (reader.HasRows)
{
while (reader.Read())
{
rows.Add($"{reader.GetInt32(0)}, {reader.GetString(1)}, {reader.GetString(2)}, {reader.GetString(3)}, {reader.GetString(4)}, {reader.GetInt32(5)}, {reader.GetInt32(6)}, {reader.GetDecimal(7)}, {reader.GetInt32(8)}, {reader.GetDateTime(9)}");
}
}
return rows;
})
.WithName("GetMembers")
.WithOpenApi();
app.Run();
internal record WeatherForecast(DateOnly Date, int TemperatureC, string? Summary)
{
public int TemperatureF => 32 + (int)(TemperatureC / 0.5556);
}
一般注解:
1.我在Visual Studio中的帐户凭据与在运行Azure SQL的Azure Portal中的帐户凭据相同。
1.我一直在关注this项目的链接。
1.我的连接字符串是“Server=tcp:xxx;String =xxx;身份验证=Active Directory默认值;“,在launchSettings.json的environmentVariable下声明。在appsettings.json中也有声明。
1.当/Members端点被调用时,我得到一个HTTP ERROR 500。
你的帮助将不胜感激,谢谢。
2条答案
按热度按时间js81xvg61#
我假设发生的情况是,它无法获得在
launchSettings.json
中声明的环境变量,仅仅是因为这个文件没有发布,因为它是要在开发环境中使用的。由于它无法获得这个env变量的值,它福尔斯string.Empty
,你稍后试图使用它来连接。500错误表明有些事情是非常错误的,在这种情况下,你正在尝试使用“”(空字符串)作为连接字符串连接到数据库。如果您已经在
appsettings.json
中声明了它,那么您应该能够像这样获取连接字符串,而不是环境变量假设您的连接字符串定义如下
nnvyjq4y2#
它在launchSettings.json的environmentVariable下声明。在appsettings.json中也被删除。
关于launchSettings.json的文档:
launchSettings.json文件:
Environment.GetEnvironmentVariable("AZURE_SQL_CONNECTIONSTRING");
appsettings.json
不影响环境变量,它们用于提供配置值-查看Configuration in ASP.NET Core文档。我建议不要直接从环境变量中获取值,而是按照更惯用的方法将它们用作配置源之一。要访问配置,您可以使用builder和app公开的
Configuration
属性,例如:连接字符串通常被放置在
ConnectionStrings
部分,例如在appsettings中可以看起来像这样:然后可以通过
GetConnectionString
方法访问它:还要检查文档的连接字符串前缀部分。
但总的来说,我强烈建议仔细阅读上述配置文档,并确定适合您用例的最佳方法(有几个专门针对Azure的配置源选项)。