无法连接到azure函数“连接字符串格式无效。值不能为空。(参数'provider')”

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

我是 azure 函数的新手,我正在编写一个程序以将文件写入 azure 存储帐户。这是我的 本地.setting.json

{
    "IsEncrypted": false,
  "Values": {
    "AzureWebJobsStorage": "UseDevelopmentStorage=true",
    "FUNCTIONS_WORKER_RUNTIME": "dotnet",
    "ConnectionString": "DefaultEndpointsProtocol=[http|https];AccountName=<accountName>;AccountKey=<accountKey>;EndpointSuffix=core.windows.net"
  }
}

文件上传.cs

namespace FileUpload
{
    public  class FileUpload
    {
        private readonly string _connectionString;

        public  FileUpload(string connectionString)
        {
           _connectionString = connectionString;
        }

        [FunctionName("FileUpload")]
        public  async Task<IActionResult> Run(
            [HttpTrigger(AuthorizationLevel.Anonymous, "post", Route = null)] HttpRequest req,
            ILogger log)
        {
            try {
                Console.WriteLine("Connection String", _connectionString);

                string Connection = _connectionString;

                string shareName = "my-share";
                string dirName = req.Query["dirName"];

                var files = req.Form.Files["File"];

                ShareClient share = new(Connection, shareName);
                ShareDirectoryClient directory = share.GetDirectoryClient(dirName);

                if (!directory.Exists())
                {
                    directory.Create();
                }

                ShareFileClient file = directory.GetFileClient(files.FileName);

                using (Stream stream = files.OpenReadStream())
                {
                    await file.CreateAsync(stream.Length);
                    await file.UploadAsync(stream);
                }

                string responseMessage = JsonConvert.SerializeObject("File uploaded successfully");

                return new OkObjectResult(responseMessage);
            }catch(Exception ex)
            {
                string responseMessage = JsonConvert.SerializeObject(ex);

                return new BadRequestObjectResult(responseMessage);
            }
        }
    }
}

这是 启动.cs

[assembly: FunctionsStartup(typeof(FileUpload.Startup))]

namespace FileUpload
{
    class Startup : FunctionsStartup
    {
        public override void Configure(IFunctionsHostBuilder builder)
        {
            string connectionString = Environment.GetEnvironmentVariable("ConnectionString");

            FileUpload file = new(connectionString);

            Console.WriteLine( "Connection String : "+ connectionString);


        }
    }
}

我可以看到它正在获取连接字符串的值,但无法连接azure共享。

它抛出

Microsoft.Extensions.Configuration.AzureAppConfiguration: Invalid connection string format.
Value cannot be null. (Parameter 'provider')

当我调整代码时它会抛出

An unhandled host error has occurred.
Microsoft.Extensions.DependencyInjection.Abstractions: Unable to resolve service for type 'System.String' while attempting to activate 'FileUpload.FileUpload'

我在这里缺少 DI 吗?如果是的话我该如何正确地做到这一点?

c# azure-functions azure-blob-storage
1个回答
0
投票

连接字符串格式无效。

上述错误表明azure存储连接字符串配置错误。在配置中正确设置连接字符串可能会解决该问题。

下面的代码运行良好。

我在 Visual Studio 中使用运行时堆栈 C# 创建了 http 触发器隔离函数。

文件上传代码:

public class Function1
{
    private readonly ILogger<Function1> _logger;

    public Function1(ILogger<Function1> logger)
    {
        _logger = logger;
    }

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

        try
        {
            var formCollection = await req.ReadFormAsync();
            var file = formCollection.Files["file"];

            if (file != null && file.Length > 0)
            {
                var connectionString = "Your storage conn-string";
                var containerName = "pavan";
                var blobName = file.FileName;

                var blobServiceClient = new BlobServiceClient(connectionString);
                var blobContainerClient = blobServiceClient.GetBlobContainerClient(containerName);
                var blobClient = blobContainerClient.GetBlobClient(blobName);

                using (var fileStream = file.OpenReadStream())
                {
                    await blobClient.UploadAsync(fileStream, true);
                }

                return new OkObjectResult($"File {blobName} uploaded successfully.");
            }
            else
            {
                return new BadRequestObjectResult("Please provide a file to upload.");
            }
        }
        catch (Exception ex)
        {
            _logger.LogError($"Error uploading file: {ex.Message}");
            return new StatusCodeResult(StatusCodes.Status500InternalServerError);
        }
    }
}

程序.cs:

using Microsoft.Azure.Functions.Worker;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;

var host = new HostBuilder()
    .ConfigureFunctionsWebApplication()
    .ConfigureServices(services =>
    {
        services.AddApplicationInsightsTelemetryWorkerService();
        services.ConfigureFunctionsApplicationInsights();
    })
    .Build();

host.Run();

以上代码运行成功,并成功将代码上传到存储容器中。

enter image description here

enter image description here

输出: enter image description here

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