我目前正在C#中构建一个本地静态站点生成器。它将一堆模板一起编译成普通旧HTML文件的层次结构。我想将生成的文件上传到我的Windows Azure网站,并将更改生效,我希望能够通过我的脚本以编程方式执行此操作。
目前,我不得不使用WebMatrix手动上传生成的文件,因为我无法找到允许我直接将HTML上传到Windows Azure网站的API或SDK。
当然必须有一种方法可以从代码中执行此操作,而不仅仅是使用sFTP库(因为它不使用WebMatrix / IIS协议,我认为发送压缩差异,会很慢并且意味着上传过程中不同步的数据,而有些文件已经更新而其他文件没有更新。)如果可以避免,我也不必将生成的网站提交给源代码控制。从概念上讲,将某些东西放入源代码控制中仅仅是作为部署的实现细节似乎是错误的。
更新:WebMatrix内部使用Web Deploy(MSDeploy)。从理论上讲,您应该能够使用API自行构建部署包,但我能找到的99%的示例都使用Visual Studio中的命令行工具或GUI工具。我需要构建包并以编程方式从C#中部署它。关于如何解决这个问题的任何想法或指导? MSDN上的文档并没有真正显示这种情况的任何示例。
答案 0 :(得分:3)
好的,所以我在微软的一些友好人士的帮助下找到了解决方法。 (请参阅David's Ebbo's response to my forum question,以及来自Sayed Hashimi的非常有用的信息,显示如何从msdeploy.exe控制台应用程序中完成我想要做的事情。)
只需从Azure门户网站获取PublishSettings文件即可。在文本编辑器中打开它以将值粘贴到下面的代码中。
var destinationOptions = new DeploymentBaseOptions()
{
// userName from Azure Websites PublishSettings file
UserName = "$msdeploytest",
// pw from PublishSettings file
Password = "ThisIsNotMyPassword",
// publishUrl from PublishSettings file using https: protocol prefix rather than 443 port
// and adding "/msdeploy.axd?site={msdeploySite-variable-from-PublishSettings}"
ComputerName = "https://waws-prod-blu-003.publish.azurewebsites.windows.net/msdeploy.axd?site=msdeploytest",
AuthenticationType = "Basic"
};
// This option says we're giving it a directory to deploy
using (var deploymentObject = DeploymentManager.CreateObject(DeploymentWellKnownProvider.ContentPath,
// path to root directory of source files
@"C:\Users\ryan_000\Downloads\dummysite"))
{
var syncOptions = new DeploymentSyncOptions();
syncOptions.WhatIf = false;
// "msdeploySite" variable from PublishSettings file
var changes = deploymentObject.SyncTo(DeploymentWellKnownProvider.ContentPath, "msdeploytest", destinationOptions, syncOptions);
Console.WriteLine("BytesCopied: " + changes.BytesCopied.ToString());
Console.WriteLine("Added: " + changes.ObjectsAdded.ToString());
Console.WriteLine("Updated: " + changes.ObjectsUpdated.ToString());
Console.WriteLine("Deleted: " + changes.ObjectsDeleted.ToString());
Console.WriteLine("Errors: " + changes.Errors.ToString());
Console.WriteLine("Warnings: " + changes.Warnings.ToString());
Console.WriteLine("ParametersChanged: " + changes.ParameterChanges.ToString());
Console.WriteLine("TotalChanges: " + changes.TotalChanges.ToString());
}
您也可能偶然发现obscure documentation on MSDN。奇怪命名的选项类有很多传递,但是在文档中有一点眯着眼睛和fla it,有可能看到命令行选项(在线查找示例更容易) )映射到API调用。
答案 1 :(得分:2)
最简单的方法可能是为您的网站设置Git publishing并以编程方式执行git提交,然后执行git push。您可以将其视为部署机制而不是源代码控制,因为Azure网站本身支持后备Git存储库,该存储库不必与您选择的SCM解决方案有任何关系。
答案 2 :(得分:1)
WebMatrix使用WebDeploy将文件上传到Windows Azure网站。
答案 3 :(得分:1)
另一种方法是使用VFS REST API(https://github.com/projectkudu/kudu/wiki/REST-API#wiki-vfs)。 diagnostic console今天使用它来处理文件系统。