Kzr*_*tof 9 c# streaming file-upload azure azure-functions
我正在探索Azure功能.到目前为止我测试的场景效果很好.
我正试图找出一种通过Azure功能上传文件(20MB +)的方法.
我们的想法是,Azure功能将首先验证经过身份验证的用户是否可以在保留请求的流并将其保存到BLOB存储之前上载文件.
这是来自客户端的代码,它创建一个StreamContent将字节发送到服务器的代码:
using (Stream fileStream = ...)
{
var streamContent = new StreamContent(fileStream);
streamContent.Headers.ContentType = new MediaTypeHeaderValue("application/octet-stream");
streamContent.Headers.ContentLength = fileStream.Length;
streamContent.Headers.Add("FileId", fileId);
var responseMessage = await m_httpClient.PutAsync(<validURI>, streamContent);
responseMessage.EnsureSuccessStatusCode();
succeeded = true;
}
Run Code Online (Sandbox Code Playgroud)
这是服务器端的代码.
[FunctionName("upload-data")]
public static async Task<HttpResponseMessage> Run([HttpTrigger(AuthorizationLevel.Function, "put")]HttpRequestMessage req, TraceWriter log)
{
try
{
// Initialize stuff.
// Validate authenticated user & privileges.
// Get the content stream of the request and
// save it in the BLOB storage.
return req.CreateResponse(HttpStatusCode.OK);
}
catch (Exception exc)
{
return req.CreateResponse(HttpStatusCode.InternalServerError, exc);
}
}
Run Code Online (Sandbox Code Playgroud)
我在方法的开头放了一个断点.无论文件有多大,我都希望在客户端发送请求后立即点击断点.但事实并非如此.
我猜测Azure函数在调用方法之前试图获取请求主体的所有内容.我还认为我发送的文件可能超过了底层Web作业的4 MB限制,但我没有看到配置它的方法.
是否可以通过流式传输将大文件上传到Azure功能?有没有办法让这项工作?
我找到了另一种做事方式.这是适合我的解决方案.
当客户端需要上传文件时,它会调用Azure功能进行身份验证(使用框架提供的身份)并授权(它可以是表存储中的简单有针对性的检查,这意味着他允许执行这样的操作).
Azure功能将要求共享访问签名来访问特定Blob.SAS将允许客户端在限定时间内以只写权限访问Blob存储(注意Azure上的时钟偏差).
然后,客户端将使用返回的SAS将文件直接上载到Blob存储.这样,它避免了Afzaal Ahmad Zeeshan提到的与客户端的长期通信,并且由于Azure功能不再依赖于客户端的连接速度,因此降低了总体成本.
Kzrystof,你在这里遵循了一种不好的做法。Azure Functions 不适用于与客户端设备的长期通信。我不确定,为什么有人可能有兴趣指导您编写一个程序来管理 Azure 功能并强制它做它不打算做的事情。
大型、长时间运行的函数可能会导致意外超时问题。
现在想象一下,您可能拥有良好的 Internet 连接,但用户可能没有。在做任何事情之前,您还必须注意其他几个问题。这是官方文档的摘录,https://docs.microsoft.com/en-us/azure/azure-functions/functions-best-practices。
如果我必须设计这个应用程序,我会使用应用服务 → Azure 存储 → Azure 函数。这将是我的应用程序架构的工作流程。
在设计方式上,我的应用程序会轮流处理这些信息,例如App Service可以负责图片上传,我可以指定用户是否可以上传。可以使用 ASP.NET Core 或任何其他语言或框架来开发 Web 应用程序的这一面,而且您确实知道这可以轻松提升以支持高达 20MB 的文件上传。
为什么我要你扭曲设计?你有一个 Blob 函数,我建议使用 Blob 函数,因为,
如果可能,函数应该是无状态和幂等的。将任何所需的状态信息与您的数据相关联。例如,正在处理的订单可能有一个关联的状态成员。函数可以根据该状态处理订单,而函数本身保持无状态。
函数本身是无状态的,这意味着它们不能持有任何关于任何东西的信息,解决这个问题需要你有另一个中间件(或前端)与身份服务器通信,这就是我建议使用应用服务的原因这里因为它可以包含验证用户的必要信息,然后是 Blob 和 &rarr 最后的函数,如果需要的话。
然后,一旦它离开那里,进入 Azure 存储,那么我可以使用 WebHook,或者直接 Blob 存储触发器从那里处理委派并在 Azure 函数中处理图像——如果函数需要的话了。看看如何使用 Blob 存储触发器为各种目的启动函数,https://docs.microsoft.com/en-us/azure/azure-functions/functions-create-storage-blob-triggered-功能。
| 归档时间: |
|
| 查看次数: |
9075 次 |
| 最近记录: |