从Azure下载上传的cspkg文件

时间:2012-09-20 16:33:24

标签: azure

我可以从我上传的Azure下载cspkg(而不是重新上传新包)吗?

情景是 -

我需要将文件添加到现有网站中 - 比如图片。

我rdp并手动添加;但是,当我的实例行为异常时,Azure会重新创建一个新实例并清除我的文件。

(理想情况下,我应该将它们存储在存储中,但问题不在于此。)

感谢您的建议!

3 个答案:

答案 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调用将cspkgcscfg文件存储在存储容器中。

请记住,此存储容器应位于同一订阅中,否则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");