azure 最小Web API未返回所需结果

unguejic  于 2023-04-22  发布在  其他
关注(0)|答案(2)|浏览(134)

我在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。
你的帮助将不胜感激,谢谢。

js81xvg6

js81xvg61#

我假设发生的情况是,它无法获得在launchSettings.json中声明的环境变量,仅仅是因为这个文件没有发布,因为它是要在开发环境中使用的。由于它无法获得这个env变量的值,它福尔斯string.Empty,你稍后试图使用它来连接。500错误表明有些事情是非常错误的,在这种情况下,你正在尝试使用“”(空字符串)作为连接字符串连接到数据库。
如果您已经在appsettings.json中声明了它,那么您应该能够像这样获取连接字符串,而不是环境变量

string connectionString = builder.Configuration.GetConnectionString("AZURE_SQL_CONNECTIONSTRING");

假设您的连接字符串定义如下

"ConnectionStrings": {
    "AZURE_SQL_CONNECTIONSTRING" : "..."
}
nnvyjq4y

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属性,例如:

var value = builder.Configuration.GetValue<string>("AZURE_SQL_CONNECTIONSTRING");
var value = app.Configuration.GetValue<string>("AZURE_SQL_CONNECTIONSTRING");

连接字符串通常被放置在ConnectionStrings部分,例如在appsettings中可以看起来像这样:

{
  // ...
  "ConnectionStrings": {
    "AZURE_SQL_CONNECTIONSTRING" : "..."
  }
}

然后可以通过GetConnectionString方法访问它:

string connectionString = Configuration.GetConnectionString("AZURE_SQL_CONNECTIONSTRING");

还要检查文档的连接字符串前缀部分。
但总的来说,我强烈建议仔细阅读上述配置文档,并确定适合您用例的最佳方法(有几个专门针对Azure的配置源选项)。

相关问题