【发布时间】:2013-11-03 05:09:52
【问题描述】:
我正在尝试通过 web-api 将文件从本地命令行客户端上传到 Azure 存储。 为此,我正在使用 Azure 网站。与客户合作不是问题。而且我在本地一切正常。这是web-api代码:
public async Task<HttpResponseMessage> PostUpload()
{
// need a local resource to store uploaded files temporarily
LocalResource localResource = null;
try
{
// Azure web-site fails here
localResource = RoleEnvironment.GetLocalResource("TempStorage");
}
catch (Exception e)
{
return Request.CreateErrorResponse(HttpStatusCode.InternalServerError, "Unable to get access to local resources");
}
var provider = new MultipartFormDataStreamProvider(localResource.RootPath);
// Read the form data.
await Request.Content.ReadAsMultipartAsync(provider);
// snipped validation code
var container = // code to get container
foreach (var fileData in provider.FileData)
{
var filename = GetBlobName(fileData);
var blob = container.GetBlockBlobReference(filename);
using (var filestream = File.OpenRead(fileData.LocalFileName))
{
blob.UploadFromStream(filestream);
}
File.Delete(fileData.LocalFileName);
}
return Request.CreateResponse(HttpStatusCode.OK);
}
当我在本地运行时一切正常,但是一旦我在 Azure 中部署网站,我就无法上传,因为 Azure 网站无权访问 LocalResource。我需要切换到 Azure Web-Role。我可以切换,但访问本地文件系统让我很困扰。
MultipartFormDataStreamProvider() 的实例需要 LocalResource。而且我还没有找到将文件上传到 WebApi 的替代方法。我的计划是channel through upload directly to Azure,而不在本地硬盘上存储任何内容。
还有其他上传文件的方法吗?
附言我见过usages of Shared Access Signatures,在那里我可以为客户端应用程序提供一个带有签名的 url,并让客户端直接上传到 Azure 博客。但是我不确定这将是多么安全,并且(还)不太舒服将签名传递给客户端。目前我认为客户端将在非常恶劣的环境中运行,并且从客户端返回的任何内容都不可信。
UPD 我的最终解决方案涉及使用在服务器上发布并传递给客户端的只写共享访问签名。然后客户端将文件直接上传到 Azure。这样我就省去了管理上传文件的很多麻烦。这是我的解决方案的more detailed description。
【问题讨论】:
-
以下代码“localResource = RoleEnvironment.GetLocalResource("TempStorage")”抛出了什么异常
-
您对使用 REST API 感到满意吗?
-
@BrianDishaw 该异常类似于“无法获取 LocalResource,System.Runtime.InteropServices.SEHException (0x80004005):外部组件已引发异常。”。此外,此页面 (msdn.microsoft.com/en-us/library/windowsazure/ee758708.aspx) 建议本地资源仅适用于 Web 和 Worker 角色,而不适用于网站。
-
@VJD 是的,有点。估计得硬着头皮,生成共享访问签名传给客户端,然后客户端通过签名直接上传文件到Azure。
-
你可能会看看我在这篇文章中的回答:stackoverflow.com/questions/15842496/… ...这里我没有具体谈论上传到 Azure,但它可能会给你一个好主意。
标签: c# azure asp.net-web-api azure-blob-storage