Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/redis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 从Azure函数调用DynamoDB时失败_C#_Amazon Dynamodb_Azure Functions - Fatal编程技术网

C# 从Azure函数调用DynamoDB时失败

C# 从Azure函数调用DynamoDB时失败,c#,amazon-dynamodb,azure-functions,C#,Amazon Dynamodb,Azure Functions,我已经创建了我的第一个Azure功能应用程序。 从这里我称之为DynamoDB端点。 我编写的代码在本地计算机上运行,但部署时返回异常,并显示以下消息: 请求缺少身份验证令牌 我已经检查了appSettings.json在部署完成后是否正确,但是我想不出为什么不添加Auth令牌的任何其他原因,这是azure特有的还是我创建了只在特定条件下工作的非常脆弱的代码 appsetting.json { "AWS": { "AccessKey": &qu

我已经创建了我的第一个Azure功能应用程序。 从这里我称之为DynamoDB端点。 我编写的代码在本地计算机上运行,但部署时返回异常,并显示以下消息:

请求缺少身份验证令牌

我已经检查了
appSettings.json
在部署完成后是否正确,但是我想不出为什么不添加Auth令牌的任何其他原因,这是azure特有的还是我创建了只在特定条件下工作的非常脆弱的代码

appsetting.json

{
  "AWS": {
    "AccessKey": "my_access_key",
    "SecretKey": "my_secret_key",
    "AWSRegion": "eu-west-2"
  }
}
相关代码

公共类启动:函数启动
{
专用IConfigurationRoot\u配置;
公共启动()
{
_配置=新的ConfigurationBuilder()
.SetBasePath(目录.GetCurrentDirectory())
.AddJsonFile(“appsettings.json”)
.Build();
}
公共覆盖无效配置(IFunctionsHostBuilder)
{
builder.Services.AddHttpClient();
builder.Services.addScope();
builder.Services.AddRetroArcadeMachinesDataRead(_配置);
builder.Services.AddAutoMapper(typeof(启动),typeof(映射配置));
}
}
公共静态类扩展
{
公共静态IServiceCollection AddRetroArcadeMachinesDataRead(此IServiceCollection服务,IConfigurationRoot配置)
{
var awsOptions=GetAWSOptions(配置);
服务。添加默认AWS选项(AWS选项);
services.AddAWSService();
services.AddTransient();
services.AddSingleton();
返回服务;
}
私有静态AWSOptions GetAWSOptions(IConfigurationRoot配置)
{
var awsOptions=configuration.GetAWSOptions();
var-accessKey=configuration.GetValue(“AWS:accessKey”);
var secretKey=configuration.GetValue(“AWS:secretKey”);
凭证=新的基本凭证(accessKey、secretKey);
awsOptions.Region=RegionEndpoint.EUWest2;
返回awsOptions;
}
提供相同结果的专用静态AWSOptions GetAWSOPtionsAlternateway(IConfigurationRoot配置)
{
var netSDKFile=new NetSDKCredentialsFile();
var配置文件=新的CredentialProfile(“基本配置文件”),新的CredentialProfile选项
{
AccessKey=configuration.GetValue(“AWS:AccessKey”),
SecretKey=configuration.GetValue(“AWS:SecretKey”)
});
profile.Region=RegionEndpoint.EUWest2;
netSDKFile.RegisterProfile(配置文件);
var awsOptions=configuration.GetAWSOptions();
var isProfileExists=netSDKFile.TryGetProfile(“基本配置文件”,out var-credentialProfile);
如果(isProfileExists)
{
A选项。凭证=
新的基本凭证(credentialProfile.Options.AccessKey、credentialProfile.Options.SecretKey);
awsOptions.Region=RegionEndpoint.EUWest2;
}
返回awsOptions;
}
}
公共类DynamoDbRoadmapRepository:IRoadmapRepository
{
私有只读IAmazonDynamoDB\u dynamodb客户端;
私有只读IDynamoDBContext\u上下文;
公共DynamoDbRoadmapRepository(IAmazonDynamoDB DynamodB客户端,IdynamodB上下文)
{
_dynamodb客户端=dynamodb客户端;
_上下文=上下文;
}
公共异步任务Get()
{
返回wait_context.ScanAsync(新列表()).GetRemainingAsync();
}
}

我终于解决了我的问题。多亏了上面的便条。我的问题是,我试图读取已添加到解决方案但未配置的
appsettings.json
文件。我以为我是通过添加

_configuration = new ConfigurationBuilder()
            .SetBasePath(Directory.GetCurrentDirectory())
            .AddJsonFile("appsettings.json")
            .Build();
但正如前面链接的答案中提到的,这一点不再得到支持。除了下面的更改外,我还必须在azure中添加变量,如前所述

我的代码如下:

public class Startup : FunctionsStartup
{
    public override void Configure(IFunctionsHostBuilder builder)
    {
        builder.Services.AddHttpClient();

        builder.Services.AddScoped<IRoadmapService, RoadmapService>();
        
        var configuration = builder.GetContext().Configuration;
        builder.Services.AddRetroArcadeMachinesDataRead(configuration);
        builder.Services.AddAutoMapper(typeof(Startup), typeof(MappingConfiguration));
    }
}

public static class StartupExtensions
{
    public static IServiceCollection AddRetroArcadeMachinesDataRead(this IServiceCollection services, IConfiguration configuration)
    {
        var awsOptions = GetAWSOptions(configuration);

        services.AddDefaultAWSOptions(awsOptions);
        services.AddAWSService<IAmazonDynamoDB>();
        services.AddTransient<IDynamoDBContext, DynamoDBContext>();

        services.AddSingleton<IRoadmapRepository, DynamoDbRoadmapRepository>();

        return services;
    }

    private static AWSOptions GetAWSOptions(IConfiguration configuration)
    {
        var accessKey = Environment.GetEnvironmentVariable("AWS:AccessKey");
        var secretKey = Environment.GetEnvironmentVariable("AWS:SecretKey");

        var awsOptions = configuration.GetAWSOptions();

        awsOptions.Credentials = new BasicAWSCredentials(accessKey, secretKey);
        awsOptions.Region = RegionEndpoint.EUWest2;

        return awsOptions;
    }
}
公共类启动:函数启动
{
公共覆盖无效配置(IFunctionsHostBuilder)
{
builder.Services.AddHttpClient();
builder.Services.addScope();
var configuration=builder.GetContext().configuration;
builder.Services.AddRetroArcadeMachinesDataRead(配置);
builder.Services.AddAutoMapper(typeof(启动),typeof(映射配置));
}
}
公共静态类扩展
{
公共静态IServiceCollection AddRetroArcadeMachinesDataRead(此IServiceCollection服务,IConfiguration配置)
{
var awsOptions=GetAWSOptions(配置);
服务。添加默认AWS选项(AWS选项);
services.AddAWSService();
services.AddTransient();
services.AddSingleton();
返回服务;
}
专用静态AWSOptions GetAWSOptions(IConfiguration配置)
{
var-accessKey=Environment.GetEnvironmentVariable(“AWS:accessKey”);
var secretKey=Environment.GetEnvironmentVariable(“AWS:secretKey”);
var awsOptions=configuration.GetAWSOptions();
凭证=新的基本凭证(accessKey、secretKey);
awsOptions.Region=RegionEndpoint.EUWest2;
返回awsOptions;
}
}
如果配置值需要DI,则说明如何