我是 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 吗?如果是的话我该如何正确地做到这一点?
连接字符串格式无效。
上述错误表明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();
以上代码运行成功,并成功将代码上传到存储容器中。
输出: