我编写了一个连接到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异常。
我错过了什么? 提前致谢
答案 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(); //...
再次感谢所有人