通过 Azure Front Door 将文件上传到 Blob 存储

Posted

技术标签:

【中文标题】通过 Azure Front Door 将文件上传到 Blob 存储【英文标题】:Upload files to blob storage via Azure Front Door 【发布时间】:2022-01-12 11:16:20 【问题描述】:

该应用设置在多个本地服务上,并定期将一些文件上传到位于美国东部的 Azure Blob 存储。但是现在有必要在澳大利亚地区放置一个应用程序的实例。结果,上传到云的时间急剧增加。 我已经测试了 Azure Front Door 是否可以帮助改进它,我发现如果我使用 Azure Front Door 链接,从 blob 存储下载的速度会快 5 倍。现在我很难更改 C# 代码以通过 Azure Front Door 上传文件。我尝试在连接字符串中使用后缀“azurefd.net”而不是“core.windows.net”,但它没有帮助。有人可以告诉我如何通过 C# 中的 Azure Front Door 将文件上传到 Azure blob 存储吗?

【问题讨论】:

【参考方案1】:

由于存储连接字符串仅使用存储端点(core.windows.net),我们不能在连接字符串中使用前门端点(azurefd.net)。

我将 Azure 存储帐户与 Front Door 集成。我可以使用 Front Door URL 访问 Azure 存储帐户中的 Blob 文件。

我们无法使用 C# 通过 Azure Front Door 将文件上传到 Blob 存储

这是因为 C# 中的 Azure 存储仅接受来自存储端点的连接字符串

【讨论】:

【参考方案2】:

很遗憾,对于上传,Azure Front Door 没有任何好处。我用了 此处描述的测试的 PUT 请求:https://docs.microsoft.com/en-us/rest/api/storageservices/put-blob

PUT https://<entityName>.azurefd.net/<containerName>/<blobName>?<sharedAccessSignature>
x-ms-version: 2020-10-02
x-ms-blob-type: BlockBlob

< C:\Downloads\t1.txt

并比较了存储帐户和 Azure Front 帐户的时间。上传速度没有差别。

我用于测试的代码:

using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Net;
using System.Net.Http;
using System.Threading.Tasks;

namespace SandboxV2

    class Program
    
        static async Task Main()
        
            string frontDoorUrl = "https://<FRONT-DOOR>.azurefd.net";
            string storageUrl = "https://STORAGE-ACCOUNT.blob.core.windows.net";
            string sasString = "...";

            Console.Write("File Path: ");
            string filePath = Console.ReadLine();
            await RunUploadTestAsync(filePath, frontDoorUrl, sasString, "-fd");
            await RunUploadTestAsync(filePath, storageUrl, sasString, "-storage");
        

        private static async Task RunUploadTestAsync(string filePath, string rootUrl, string sasString, string suffix)
        
            string blobName = Path.GetFileNameWithoutExtension(filePath) + suffix + Path.GetExtension(filePath);
            Console.WriteLine(rootUrl);
            string containerName = "testaccess";
            var speeds = new List<double>();
            var times = new List<TimeSpan>();
            for (int i = 0; i < 5; i++)
            
                var t1 = DateTime.UtcNow;
                var statusCode = await UploadAsSingleBlock(filePath, rootUrl, blobName, containerName, sasString);
                var t2 = DateTime.UtcNow;

                var time = t2 - t1;
                var speed = new FileInfo(filePath).Length / time.TotalSeconds / 1024 / 1024 * 8;
                speeds.Add(speed);
                times.Add(time);
                Console.WriteLine($"Code: statusCode. Time: time. Speed: speed");
            
            Console.WriteLine($"Average time: TimeSpan.FromTicks((long)times.Select(t => t.Ticks).Average()). Average speed: speeds.Average().");
        

        private static async Task<HttpStatusCode> UploadAsSingleBlock(string filePath, string rootUrl, string blobName, string containerName, string sasString)
        
            var request = new HttpRequestMessage(HttpMethod.Put, $"rootUrl/containerName/blobName?sasString");
            request.Headers.Add("x-ms-version", "2020-10-02");
            request.Headers.Add("x-ms-blob-type", "BlockBlob");

            HttpResponseMessage response;
            using (var fileStream = new FileStream(filePath, FileMode.Open, FileAccess.Read, FileShare.Read))
            
                request.Content = new StreamContent(fileStream);
                using (var client = new HttpClient())
                    response = await client.SendAsync(request, HttpCompletionOption.ResponseHeadersRead);
            
            return response.StatusCode;
        

    

【讨论】:

以上是关于通过 Azure Front Door 将文件上传到 Blob 存储的主要内容,如果未能解决你的问题,请参考以下文章

Azure Front Door、应用服务访问限制和 AD 身份验证

Accelerate Games With Azure Front Door

使用 Azure Front Door 时缺少 UserId 属性的应用程序见解

Azure Front Door 服务忽略 403 - 应用停止错误

Azure Front Door Visual Studio 远程调试

Azure Front-Door - X-Azure-ClientIP 显示的是 IPV6 地址而不是 IPV4