我正在尝试创建实用程序以从Internet下载文件,然后将其再次上传到Azure blob存储。Blob容器已经很好地创建了;但是由于某种原因,当我尝试将文件上传到存储设备时,出现“ Bad Request 400”异常。创建了容器名称,小写字母和特殊字符。但是我仍然不知道为什么我会得到例外!
请帮助。
注:
这里是例外:
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&context)在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(流源,Nullable 1长度,AccessCondition accessCondition,BlobRequestOptions选项,OperationContext operationContext)在Microsoft.WindowsAzure.Storage.Blob.CloudBlockBlob.UploadFromStream(流源,AccessCondition accessCondition,BlobRequestOptions选项,OperationContext operationContext)在TelawatAzureUtility.StorageService中。索取资料RequestID:RequestDate:Sat,28 Jun 2014 20:12:14 GMTStatusMessage:错误请求
编辑2:请求信息:
<< img src =“ https://image.soinside.com/eyJ1cmwiOiAiaHR0cHM6Ly9pLnN0YWNrLmltZ3VyLmNvbS9yQTVRZS5wbmcifQ==” alt =“在此处输入图像描述”>
<< img src =“ https://image.soinside.com/eyJ1cmwiOiAiaHR0cHM6Ly9pLnN0YWNrLmltZ3VyLmNvbS9RdzEyTC5wbmcifQ==” alt =“在此处输入图像描述”>
编辑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();
}
}
}
}
}
同样,当我尝试此代码时,'等待'将永远不会完成!”>
webUtil.DownloadAsync(url, downloadedFilePath).Wait()
我正在尝试创建实用程序以从Internet下载文件,然后将其再次上传到Azure blob存储。 Blob容器已经很好地创建了;但是由于某种原因,我收到“错误请求400” ...
您是否尝试过在azure门户上手动创建容器?您可以给容器命名的名称有一些限制。
我在Azure存储消息队列中也遇到此错误。
我有一个非常不同的错误请求消息案例。在这里张贴给其他可能遇到相同问题的人。就我而言,我只是在其他资源组之间移动资源。在改组中,天蓝色的错误使我可以将存储指向该地区无法使用的位置(“东南亚”)。因此,针对存储帐户的所有请求都返回了错误的请求消息。我花了一些时间才弄清楚这一点,因为然后我创建了另一个存储帐户进行测试,在创建时,azure不允许我选择“东南亚”作为选择的位置,因此我选择了另一个位置(“东亚” ”),然后一切正常。
如果创建的容器名称无效,将导致(400)错误请求。创建容器名称有一些约定,如下所示:
我在Azure中使用来自C#代码的一个UpperCase Letter创建队列时遇到相同的问题。错误与队列名称有关。所有字符均应小写。将所有字符更改为小写字母后,它起作用了! :)