Asp.net MVC 网站,在 Azure 上使用 ClickOnce 应用程序

本文关键字:ClickOnce 应用程序 Azure net MVC 网站 Asp | 更新日期: 2023-09-27 18:36:37

我有一个部署到 Azure 云服务的 Asp.net MVC 网站。在那里,我需要一个~/ClickOnce应用程序,客户可以从中下载应用程序。应用程序会不断更新,因此我无法将它们部署为 Azure 部署包的一部分,但这实际上应该是我可以自行更新的文件夹。

据我了解,每次重新启动 Web 角色时都会清理该文件夹。我需要更多可以手动更新(甚至通过远程桌面)的持久本地存储,并且应该可以从网站(http://mywebsite.cloudapp.net/ClickOnce/..)获得。

有没有办法将本地存储文件夹映射到网站路径?

Asp.net MVC 网站,在 Azure 上使用 ClickOnce 应用程序

您可以创建一个为文件提供服务的控制器:

routes.MapRoute(
    null,
    "ClickOnce/{*fileName}",
    new { controller = "File", action = "GetFile", fileName = UrlParameter.Optional },
    new[] { "MyApp.Web.Controllers" }
);
// in FileController
public FilePathResult GetFile(string fileName)
{
    var dir = Server.MapPath("/local/storage/directory");
    var path = Path.Combine(dir, fileName);
    return File(path, GetMimeType(Path.GetExtension(fileName));
}
// see http://msdn.microsoft.com/en-us/library/ms228998.aspx 
private string GetMimeType(string extension)
{
    if (extension == ".application" || extension == ".manifest")
        return "application/x-ms-application";
    else if (extension == ".deploy")
        return "application/octet-stream";
    else
        return "application/x-msdownload";
}

如果您考虑一下,这有很大的优势:

ClickOnce 更新位置已烘焙到客户端中,因此无法更改。

但是通过这个简单的设置,您可以为不同的客户端返回不同的版本。因此,也许您想将新版本分配给某些客户端以在野外进行测试。或者,客户只能更新到特定版本,除非他购买了更新。

为此,您必须为每个版本保留每个.application文件,并返回适当的文件。

customer1 request yourapp.application -> return yourapp-1.1.application
customer2 request yourapp.application -> return yourapp-1.2.application

从技术上讲,可以通过使用远程桌面连接连接到应用程序实例来手动更新文件夹,但由于 Azure 云服务的无状态性质,因此严格不建议这样做

更好的解决方案是 host your ClickOnce deployment files in blob storage .这样,您可以独立于应用程序更新来更新它们。有关更多详细信息,请查看此博客文章:https://robindotnet.wordpress.com/2011/02/13/how-to-host-a-clickonce-deployment-in-azure-blob-storage/。