로컬 명령 행 클라이언트에서 Web-api를 통해 Azure 저장소로 파일을 업로드하려고합니다. 저는 Azure 웹 사이트를 사용하고 있습니다. 클라이언트와 작업하는 것은 문제가되지 않습니다. 그리고 나는 모든 것이 잘 작동하고 있습니다. 내가 로컬로 실행,하지만 최대한 빨리 푸른에 웹 사이트를 배포, 나는 업로드 할 수없는 경우 하늘빛 웹 사이트가 없기 때문에로컬 파일 시스템에 액세스하지 않고 WebApi를 통해 Azure Blob 저장소에 파일 업로드
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);
}
모든 것이 잘 작동 다음은 웹 API를 코드는 LocalResource에 대한 액세스. Azure Web-Role로 전환해야합니다. 전환 할 수 있지만 로컬 파일 시스템에 액세스하는 것은 모두 나를 괴롭 히고 있습니다.
LocalResource는 MultipartFormDataStreamProvider() 인스턴스에 필요합니다. 그리고 WebApi에 파일을 업로드하는 다른 방법을 찾지 못했습니다. 내 계획은 로컬 HDD에 아무것도 저장하지 않고 channel through upload directly to Azure입니다.
파일을 업로드하는 다른 방법이 있습니까?
p.s. 나는 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) : 외부 구성 요소가 예외를 발생 시켰습니다. "또한이 페이지 (http://msdn.microsoft.com/en-us/library/windowsazure/ee758708.aspx)는 로컬 리소스가 웹 및 웹 사이트가 아닌 작업자 역할 – trailmax