【发布时间】:2019-06-05 18:09:19
【问题描述】:
我正在开发 Azure 中的 Web 服务框架,以及与 Azure 通信的网站。网站应使用文件名调用 Azure,Azure 中的 Web 服务应在 Blob 存储中找到给定文件并将其发送回客户端进行下载。
只要返回的文件很小,我就可以让它工作(使用 20mb mp4 文件进行测试可以正常工作),但是像 1Gb mp4 文件这样的文件最终会引发异常。
C#请求代码:
public override async Task ProcessRequestAsync(HttpContext context)
{
JavaScriptSerializer oSearlizer = new JavaScriptSerializer();
object o = new
{
sourceStorageAccountName = "accountName",
sourceStorageAccountKey = "accountKey",
sourceContainer = "test"
};
string req = oSearlizer.Serialize(o);
HttpContent content = new StringContent(req, Encoding.UTF8, "application/json");
HttpClient client = new HttpClient();
HttpResponseMessage x = await client.PostAsync("http://localhost:7071/api/get_file", content);
context.Response.Clear();
context.Response.Buffer = false;
context.Response.BufferOutput = false;
context.Response.ContentType = "video/mp4";
context.Response.AddHeader("content-disposition", "attachment;filename=test.mp4"); // Save file
context.Response.Charset = "";
context.Response.Cache.SetCacheability(HttpCacheability.NoCache);
context.Response.BinaryWrite(await x.Content.ReadAsByteArrayAsync());
context.Response.End();
}
Azure 网络服务代码:
CloudBlobContainer sourceBlobContainer = CopyBlobHelpers.GetCloudBlobContainer(_sourceStorageAccountName, _sourceStorageAccountKey, _sourceContainer);
CloudBlockBlob blob = sourceBlobContainer.ListBlobs().First();
HttpResponseMessage response = new HttpResponseMessage(HttpStatusCode.OK);
Stream stream = blob.OpenRead(null, new BlobRequestOptions() { ServerTimeout = new System.TimeSpan(2, 59, 59), MaximumExecutionTime = new System.TimeSpan(2, 59, 59) });
response.Content = new StreamContent(stream);
response.Content.Headers.ContentDisposition = new ContentDispositionHeaderValue("attachment");
response.Content.Headers.ContentDisposition.FileName = fileNameZip;
response.Content.Headers.ContentType = new MediaTypeHeaderValue("video/mp4");
return response;
就像我说的,此代码适用于 20mb 的 mp4 文件,但对于 1Gb 或更大的 mp4 文件会引发异常。我得到的异常是:“异常:SocketException:现有连接被远程主机强行关闭”
如果我从请求代码中删除“await”并改用“.Result”,我会得到一个不同的异常:“异常:HttpRequestException:将内容复制到流时出错。”
单步执行代码,进入“await client.PostAsync()”,我单步执行Azure Web服务代码,直到返回语句。然后我再一步,1-2分钟没有任何反应,然后抛出异常。
有人对可能发生的事情有任何想法吗?我认为这与试图通过过多数据或某处超时的流有关,但我所做的似乎没有解决问题。
【问题讨论】:
标签: c# azure azure-functions