Я пытаюсь создать утилиту для загрузки файла из Интернета и загрузить его снова в хранилище Azure blob. Контейнеры Blob уже созданы хорошо; Но по какой-то причине я получаю исключение "Bad Request 400", когда я пытался загрузить файл на хранение... Создано имя контейнера, маленькие буквы, а также специальные символы. Но я до сих пор не знаю, почему я получаю исключение!
Пожалуйста, помогите.
Примечание:
- Я не использую эмулятор... Непосредственно тестирую в облаке.
- Все мои контейнеры с опцией доступа к "Public Container".
Вот исключение:
An exception of type 'Microsoft.WindowsAzure.Storage.StorageException'
occurred in Microsoft.WindowsAzure.Storage.dll but was not handled in user code
Additional information: The remote server returned an error: (400) Bad Request.
И вот код:
foreach (var obj in objectsList)
{
var containerName = obj.id.Replace("\"", "").Replace("_", "").Trim();
CloudBlobContainer blobContainer = blobClient.GetContainerReference(containerName);
if (blobContainer.Exists())
{
var fileNamesArr = obj.fileNames.Split(new char[] { '#' }, StringSplitOptions.RemoveEmptyEntries);
foreach (var sora in fileNamesArr)
{
int soraInt = int.Parse(sora.Replace("\"", ""));
String fileName = String.Format("{0}.mp3", soraInt.ToString("000"));
var url = String.Format("http://{0}/{1}/{2}", obj.hostName.Replace("\"", ""), obj.id.Replace("\"", ""), fileName.Replace("\"", "")).ToLower();
var tempFileName = "temp.mp3";
var downloadedFilePath = Path.Combine(Path.GetTempPath(), tempFileName).ToLower();
var webUtil = new WebUtils(url);
await webUtil.DownloadAsync(url, downloadedFilePath).ContinueWith(task =>
{
var blobRef = blobContainer.GetBlockBlobReference(fileName.ToLower());
blobRef.Properties.ContentType = GetMimeType(downloadedFilePath);
using (var fs = new FileStream(downloadedFilePath, FileMode.Open, FileAccess.Read, FileShare.Read))
{
blobRef.UploadFromStream(fs); // <--- Exception
}
});
}
}
else
{
throw new Exception(obj.id.Replace("\"", "") + " Container not exist!");
}
}
Изменить: исключение хранения
Microsoft.WindowsAzure.Storage.StorageException: удаленный сервер ответил на ошибку: (400) Неверный запрос. --- > System.Net.WebException: удаленный сервер ответил на ошибку: (400) "Плохой запрос". в System.Net.HttpWebRequest.GetRequestStream(TransportContext & контекст) в System.Net.HttpWebRequest.GetRequestStream() в Microsoft.WindowsAzure.Storage.Core.Executor.Executor.ExecuteSync [T] (RESTCommand
1 cmd, IRetryPolicy policy, OperationContext operationContext) --- End of inner exception stack trace --- at Microsoft.WindowsAzure.Storage.Core.Executor.Executor.ExecuteSync[T](RESTCommand
1 cmd, политика IRetryPolicy, OperationContext operationContext) в Microsoft.WindowsAzure.Storage.Blob.CloudBlockBlob.UploadFromStreamHelper(источник потока, длина Nullable1, доступ AccessConditionCondition, параметры BlobRequestOptions, операция OperationContextContext) в Microsoft.WindowsAzure.Storage.Blob.CloudBlockBlob.UploadFromStream(источник потока, AccessCondition accessCondition, параметры BlobRequestOptions, OperationContext operationContext) в TelawatAzureUtility.StorageService. < > c__DisplayClass4.b__12 (задача задачи) в\psf\Главная\Documents\Visual Studio 14\Projects\Telawat Azure Utility\TelawatAzureUtility\StorageService.cs: строка 128 Запрашивать информацию RequestID: RequestDate: Сб, 28 июн 2014 20:12:14 GMT StatusMessage: неверный запрос
Изменить 2: Запросить информацию:
Изменить 3: проблема возникает из WebUtils.. Я заменил его на код ниже, и он работает! Я добавлю код weUtils, возможно, вы можете помочь узнать, в чем проблема с ним.
HttpClient client = new HttpClient();
var stream = await client.GetStreamAsync(url);
Код WebUtils:
public class WebUtils
{
private Lazy<IWebProxy> proxy;
public WebUtils(String url)
{
proxy = new Lazy<IWebProxy>(() => string.IsNullOrEmpty(url) ? null : new WebProxy {
Address = new Uri(url), UseDefaultCredentials = true });
}
public IWebProxy Proxy
{
get { return proxy.Value; }
}
public Task DownloadAsync(string requestUri, string filename)
{
if (requestUri == null)
throw new ArgumentNullException("requestUri is missing!");
return DownloadAsync(new Uri(requestUri), filename);
}
public async Task DownloadAsync(Uri requestUri, string filename)
{
if (filename == null)
throw new ArgumentNullException("filename is missing!");
if (Proxy != null)
{
WebRequest.DefaultWebProxy = Proxy;
}
using (var httpClient = new HttpClient())
{
using (var request = new HttpRequestMessage(HttpMethod.Get, requestUri))
{
using (Stream contentStream = await (await httpClient.SendAsync(request)).Content.ReadAsStreamAsync())
{
using (var stream = new FileStream(filename, FileMode.Create, FileAccess.Write))
{
contentStream.CopyTo(stream);
stream.Flush();
stream.Close();
}
contentStream.Close();
}
}
}
}
}
Также, когда я пробовал этот код... "Wait" никогда не закончится и не завершится!
webUtil.DownloadAsync(url, downloadedFilePath).Wait()