使用 RTM 版本,由于 Azure 要求代码,Framework 4 在 Azure 模拟器上正常工作 - 我怀疑问题与路径/环境变量有关。Azure Web 角色失败并出现 404 错误
这是控制器代码:
[ValidateInput(false)]
public HttpResponseMessage Post()
{
try
{
if (!Request.Content.IsMimeMultipartContent("form-data"))
{
throw new HttpResponseException(HttpStatusCode.UnsupportedMediaType);
}
string tempPath = RoleEnvironment.GetLocalResource("tempStorage").RootPath;
Environment.SetEnvironmentVariable("TEMP", tempPath);
Environment.SetEnvironmentVariable("TMP", tempPath);
string Host = "test";
string StorageConnection = "credentials here";
string Product = "Product";
string CompanyID = "Company";
DocStorage docStorage = new DocStorage(Host, Product, CompanyID, StorageConnection);
var multipartStreamProvider = new AzureBlobStorageMultipartProvider(docStorage.BlobContainer, tempPath);
Stream reqStream = Request.Content.ReadAsStreamAsync().Result;
if (reqStream.CanSeek)
{
reqStream.Position = 0;
}
Request.Content.ReadAsMultipartAsync<AzureBlobStorageMultipartProvider>(multipartStreamProvider).ContinueWith<List<FileDetails>>(t =>
{
if (t.IsFaulted)
{
throw t.Exception;
}
AzureBlobStorageMultipartProvider provider = t.Result;
foreach (var fileData in provider.FileData)
{
string fileName = Path.GetFileName(fileData.Headers.ContentDisposition.FileName.Trim('"'));
string fileNameBlob = Path.GetFileName(fileData.LocalFileName.Trim('"'));
CloudBlob blob = docStorage.BlobContainer.GetBlobReference(fileNameBlob);
if (!string.IsNullOrEmpty(provider.FormData["company"]))
blob.Metadata[AriettDocStorage.FileNameFileLocation] = provider.FormData["company"];
blob.SetMetadata();
}
return provider.Files;
});
return new HttpResponseMessage(HttpStatusCode.OK);
}
catch
{
return new HttpResponseMessage(HttpStatusCode.NotFound);
}
}
这是覆盖
public class AzureBlobStorageMultipartProvider : MultipartFormDataStreamProvider
{
public CloudBlobContainer Container;
public AzureBlobStorageMultipartProvider(CloudBlobContainer container, string tempPath)
: base(tempPath)
{
Container = container;
}
public override Task ExecutePostProcessingAsync()
{
// Upload the files to azure blob storage and remove them from local disk
foreach (var fileData in this.FileData)
{
string fileName = Path.GetFileName(fileData.Headers.ContentDisposition.FileName.Trim('"'));
// Retrieve reference to a blob
string fileNameBlob = Path.GetFileName(fileData.LocalFileName.Trim('"'));
CloudBlob blob = Container.GetBlobReference(fileNameBlob);
blob.Properties.ContentType = fileData.Headers.ContentType.MediaType;
blob.UploadFile(fileData.LocalFileName);
blob.SetProperties();
File.Delete(fileData.LocalFileName);
Files.Add(new FileDetails
{
ContentType = blob.Properties.ContentType,
Name = blob.Name,
Size = blob.Properties.Length,
Location = blob.Uri.AbsoluteUri
});
}
return base.ExecutePostProcessingAsync();
}