我可以从我上传的Azure下载cspkg(而不是重新上传新包)吗?
情景是 -
我需要将文件添加到现有网站中 - 比如图片。
我rdp并手动添加;但是,当我的实例行为异常时,Azure会重新创建一个新实例并清除我的文件。
(理想情况下,我应该将它们存储在存储中,但问题不在于此。)
感谢您的建议!
答案 0 :(得分:5)
[以下段落不正确]
目前没有可以直接从上传的Windows Azure门户下载完全相同的CSPKG的API或机制。当您放弃Windows Azure项目/解决方案时,这确实是Windows Azure用户的一项重要要求。
[编辑 - 对上段的更正]
使用"Get Package" REST API,您可以将软件包从特定部署下载到Azure博客存储。如果您决定编写自己的C#应用程序以使用REST API,则示例为here。如果你不想编写API并且只是使用REST调用来下载软件包,那么有一些工具我使用了BURP (based on Java),如我的博客here中所述。您可以使用博客中的信息来设置连接到Azure门户,然后使用记录的REST调用来获取软件包。
接下来即使您下载CSPKG(或拥有CSPKG的本地副本)仍然无法通过直接添加或删除任何内容来编辑它,因为这会破坏CSPKG程序包的完整性,并且上传它会出错。必须使用CSPACK工具创建包。
驱动器E:\你的批准确实包含了大部分已编译的代码,所以如果你可以在本地下载它并提出构建一个新项目形式(???)的想法,这可能是一个选项。如果软件包是使用CSPACK工具直接创建的,并且从驱动器E:\下载文件并重新创建软件包确实有效,但是如果项目中的复杂应用程序包含源代码和编译代码文件,即ASP.NET / MVCx应用程序,则很难。
答案 1 :(得分:3)
我遇到了类似的问题,
我做的是,
使用Get-Package
REST API调用将cspkg
和cscfg
文件存储在存储容器中。
请记住,此存储容器应位于同一订阅中,否则Get-Package REST API调用将失败。
然后我使用AzCopy(http://blogs.msdn.com/b/windowsazurestorage/archive/2012/12/03/azcopy-uploading-downloading-files-for-windows-azure-blobs.aspx)将文件从存储容器复制到我的本地磁盘。
您也可以使用AzCopy从一个StorageContainer复制到另一个,即使在不同的订阅下也是如此。
如果您需要更多详细信息,请与我们联系。
答案 2 :(得分:2)
使用Windows Azure Service Management Library NuGet包,获取包的C#代码变为:
private static X509Certificate2 GetCertificate(string storeName, string thumbprint)
{
var store = new X509Store(storeName);
store.Open(OpenFlags.ReadOnly);
return store.Certificates.Find(X509FindType.FindByThumbprint, thumbprint, true)[0];
}
public static void ExportPackage(X509Certificate2 certificate, string subscriptionId, string serviceName, string deploymentName, string containerUri)
{
var managementService = ServiceManagementHelper.CreateServiceManagementChannel("WindowsAzureEndPoint", certificate);
try
{
managementService.GetPackage(
subscriptionId,
serviceName,
deploymentName,
containerUri,
true /*overwriteExisting*/);
}
catch (Exception ex)
{
System.Net.WebException exception = ex.InnerException as System.Net.WebException;
if (exception != null)
{
string responseText;
using (var reader = new System.IO.StreamReader(exception.Response.GetResponseStream()))
{
responseText = reader.ReadToEnd();
Console.WriteLine("ERROR:" + exception);
Console.WriteLine(responseText);
}
}
}
}
然而,我的问题是,无论我作为containerUri传入什么内容,我都会收到400 Bad request - 参数值&some 39. something.blob.core.windows.net/somecontainer' ;;为参数' ContainerUriString'指定是无效的。
更新:我的问题是由于存储容器属于不同的订阅 - 显然无法正常工作。我确保容器属于同一订阅,瞧!
更新:此代码假定以下app.config:
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<startup>
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5.1" />
</startup>
<system.serviceModel>
<bindings>
<webHttpBinding>
<binding name="WindowsAzureServiceManagement_WebHttpBinding" closeTimeout="00:01:00" openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:01:00">
<readerQuotas maxStringContentLength="1048576" maxBytesPerRead="131072"/>
<security mode="Transport">
<transport clientCredentialType="Certificate"/>
</security>
</binding>
</webHttpBinding>
</bindings>
<client>
<endpoint name="WindowsAzureEndPoint" address="https://management.core.windows.net" binding="webHttpBinding" bindingConfiguration="WindowsAzureServiceManagement_WebHttpBinding" contract="Microsoft.Samples.WindowsAzure.ServiceManagement.IServiceManagement" />
</client>
</system.serviceModel>
</configuration>
或者,对于LinqPad用户,您可以按如下方式内联配置Web服务:
var b = new WebHttpBinding(WebHttpSecurityMode.Transport);
b.Security.Transport.ClientCredentialType = HttpClientCredentialType.Certificate;
var address = new EndpointAddress("https://management.core.windows.net");
var managementService = ServiceManagementHelper.CreateServiceManagementChannel(b, address.Uri, certificate);
典型用途:
X509Certificate2 certificate = GetCertificate("My", "NNNNNNNNNNNNN");
ExportPackage(certificate,
"00000000-0000-0000-0000-000000000000",
"yourservice",
"00000000000000000000000000000000",
"https://yourstorage.blob.core.windows.net/container");