我可以从 Azure 下载我上传的 cspkg(而不是重新上传新包)吗?
情景是——
我需要将文件添加到现有网站中 - 比如说一张图片。
我 rdp 并手动添加;但是,当我的实例表现异常时,Azure 会重新创建一个新实例并清除我的文件。
(理想情况下,我应该将它们存储在存储中,但问题不在于那个。)
感谢您的意见!
我可以从 Azure 下载我上传的 cspkg(而不是重新上传新包)吗?
情景是——
我需要将文件添加到现有网站中 - 比如说一张图片。
我 rdp 并手动添加;但是,当我的实例表现异常时,Azure 会重新创建一个新实例并清除我的文件。
(理想情况下,我应该将它们存储在存储中,但问题不在于那个。)
感谢您的意见!
[以下段落不正确]
目前没有任何 API 或机制可以直接从已上传的 Windows Azure 门户下载完全相同的 CSPKG。当您失去 Windows Azure 项目/解决方案时,这肯定是 Windows Azure 用户的一项重大要求。
[编辑-更正上段]
使用“获取包” REST API,您可以将包从特定部署下载到您的 Azure 博客存储。如果您决定编写自己的 C# 应用程序以使用 REST API,则示例在这里。如果您不想编写 API,而只是使用 REST 调用下载包,则有一些工具,我使用了BURP(基于 Java),如我的博客中所述。您可以使用博客中的信息来设置连接到 Azure 门户,然后使用文档中的 REST 调用来获取包。
接下来,即使您下载了 CSPKG(或拥有 CSPKG 的本地副本),您仍然无法通过直接向其中添加或删除任何内容来对其进行编辑,因为这会破坏 CSPKG 包的完整性,并且您将在上传时遇到错误。必须使用 CSPACK 工具创建包。
您的 approot 所在的 Drive E:\ 确实包含您的大部分编译代码,因此如果您可以在本地下载它并想出一个想法来构建一个新的项目表单(???),那可能是一个选择。如果包是直接使用 CSPACK 工具创建的,并且从驱动器 E:\ 下载文件并重新创建包确实有效,但是如果项目的复杂应用程序包含源代码和编译的代码文件,即 ASP.NET/MVCx 应用程序,则很难.
我遇到了类似的问题,
我所做的是,
使用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 复制到另一个。
如果您需要更多详细信息,请告诉我。
使用Windows Azure 服务管理库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 - Parameter value '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");