无法以编程方式下载文件(C#)

时间:2013-04-14 07:22:49

标签: c# azure azure-storage azure-storage-blobs

我编写了一个连接到Azure存储帐户的c#程序。

给定blob 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。

我错过了什么? 提前致谢

3 个答案:

答案 0 :(得分: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

这基本上导航了页面,无论证书是否经过验证。

答案 1 :(得分:1)

我看到您正在尝试将文件写入C:驱动器。在Windows Azure中,不允许使用开箱即用的功能。有关详细信息,请参阅此博客文章:http://blog.codingoutloud.com/2011/06/12/azure-faq-can-i-write-to-the-file-system-on-windows-azure/。正如博客文章中提到的,一个选项可能是将blob保存到本地存储并从那里执行。

答案 2 :(得分:1)

好的,谢谢大家,我终于找到了解决方案:

我最终完成的是在角色的服务定义中定义本地存储,如下所示:

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

然后只使用这个本地存储从blob下载文件并执行它:

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(); //...

再次感谢所有人