2013-04-14 3 views
0

Я пишу программу C#, связанную с учетной записью Azure Storage.Невозможно загрузить файл программно (C#)

Учитывая URI блоба, мне нужно загрузить файл в локальный файл и выполнить его.

Вот мой кусок кода:

var blobClientCode = client.CreateCloudBlobClient(); 
CloudBlockBlob codeBlob = blobClientCode.GetBlockBlobReference(codeUri); 
File.Create("C:\\code.exe"); 
using (var fileStream = File.OpenWrite("C:\\code.exe")) { 
    codeBlob.DownloadToStream(fileStream); 
} 

Process p = new Process(); 
p.StartInfo.FileName = "C:\\mycode.exe"; 
p.StartInfo.Arguments = dataUri; 
p.StartInfo.CreateNoWindow = true; 
p.StartInfo.RedirectStandardOutput = false; 
p.StartInfo.UseShellExecute = false; 
p.Start(); 
p.WaitForExit(); 
string output = p.StandardOutput.ReadToEnd(); 

Проблема заключается в том, что я получаю UnauthorizedAccess исключение.

  • Когда я пытаюсь загрузить файл вручную из браузера (копия вставляет URI) Я преуспеваю.
  • Контейнер является открытым.
  • Я также попытался использовать WebClient.DownloadFile() и получил WebException.

Что мне не хватает? Заранее спасибо

+0

- это URI, начинающийся с http или https ?? .. Если он начинается с https..если сертификат проверен? –

+0

@RohitAgrawal начинается с https. Но я не понял вопроса ... как мне его проверить? – DanielY

+0

, когда вы скопируете его в браузере, он открывается напрямую или открывается с предупреждением о том, что сертификат не проверен. Нужно продолжать? –

ответ

1

ИТАК, благодаря всем вам я, наконец, достиг в раствор:

То, что я, наконец, сделал определял локальное хранилище в определении службы ролей, как это:

<LocalResources> 
<LocalStorage name="myLocalStorage" sizeInMB="10" cleanOnRoleRecycle="false" /> 
</LocalResources> 

а потом просто использовали это локальное хранилище для загрузки файла из сгустка и выполнить его:

LocalResource localResource = RoleEnvironment.GetLocalResource("myLocalStorage"); 
string PathToFile = Path.Combine(localResource.RootPath, "mycode.exe"); 
ServicePointManager.SecurityProtocol = SecurityProtocolType.Ssl3; 
ServicePointManager.ServerCertificateValidationCallback = new System.Net.Security.RemoteCertificateValidationCallback(delegate { return true; }); 
WebClient webclient = new WebClient(); 
webclient.DownloadFile(codeUri, PathToFile); 

Process p = new Process(); //... 

Еще раз спасибо всем вам

1

Попробуйте включить нижеприведенный фрагмент кода перед вызовом webclient.DownloadFile. Надеюсь, что это должно работать ..

ServicePointManager.SecurityProtocol = SecurityProtocolType.Ssl3; 

    ServicePointManager.ServerCertificateValidationCallback = new System.Net.Security.RemoteCertificateValidationCallback(delegate { return true; }); 

WebClient webclient = new WebClient(); 
webclient.DownloadFile(new Uri(URIPath), LocalPath); 

Примечание: если доступ в Интернет с использованием прокси-сервера вы, возможно, потребуется установить параметр

WebProxy ProxyObject = ProxySetting; 
webclient.Proxy = ProxySetting 

прокси;

Это в основном перемещает страницу независимо от того, проверен сертификат или нет.

+0

Такое же исключение :( – DanielY

+0

@ user1067083 вы можете отправить сообщение точное исключение ошибки, которое вы получаете –

+0

Странно, что он работает, если я запускаю его на компьютере с эмулятором, но я получаю это исключение ошибки только тогда, когда я запускаю его в облаке – DanielY

1

Я вижу, что вы пытаетесь записать файл на диск C:. В Windows Azure это не допускается из коробки. Пожалуйста, смотрите эту запись в блоге: http://blog.codingoutloud.com/2011/06/12/azure-faq-can-i-write-to-the-file-system-on-windows-azure/. Как упоминалось в сообщении в блоге, одним из вариантов может быть сохранение blob в локальном хранилище и выполнение оттуда.

+0

Он работал, когда я запускал эту программу локально (с моего компьютера) .Она подключалась к моему хранилищу Azure и запускала все это. Эта ошибка получается только тогда, когда рабочая роль запускается в облаке. – DanielY

+1

Возможно, это связано с тем, что когда мы запускаем материал в локальном эмуляторе, мы запускаем код в повышенном (помните, что вы запускали Visual Studio в качестве администратора), который дает разрешение на запись в C: \. То же самое не верно, когда код работает в облаке. –

+0

Итак, что мне делать? Я не понимаю ничего из вашей ссылки, и я еще не знаком с C# – DanielY

Смежные вопросы