ClickOnce 发布 WinForm 应用程序后,本机可以下载安装和使用,别的机子就不行

BruceLu 2014-09-27 02:25:41
我使用的IDE为VS2013,系统是Win8.1企业版,IIS是Win8下的8.5版。试下载ClickOnce的客户机的环境和开发环境的机子一模一样。

问题是这样的,我用 C# 按网上的资源写了一个WinForm的应用程序,然后用ClickOnce的方式发布了程序,在开发的本机上是可以成功下载、安装和使用应用程序。但是通过局域网访问ClickOnce发布的机子下载应用程序却下载不了,报URLDownloadToCacheFile failed with HRESULT '-2146697211'。而两台机子网是互通的,也可以互ping,做文件共享和访问是没有问题的,就是在用到ClickOnce时,客户机上可以下载主程序AppMain,也运行,但另两个就下载不了。

后来为了测试,又另外弄了个新的解决方案,并在新的解决方案就添加了一个WinForm项目,还是拿 ClickOnce 发布,也是只能本机下载和运行,另一台机子就不行。

在使用 ClickOnce 时,不知道是什么原因导致这样,还是说 IIS 中要设置什么吗?望大家交流,帮忙解答一下,谢谢各位了。

我试写的程序是这样的:主Form是一个引导程序,然后通过这个程序去下载安装其他应用程序。界面如下:


代码:一个解决方案下有三个 WinForm 的项目,一个是AppMain主程序,另二个就是一般的WinForm窗口。
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using App1;
using App2;
// 凡是和 ClickOnce 部署有关的类都位于 System.Deployment.Application 命名空间下
using System.Deployment.Application;

namespace AppMain
{
public partial class frmMain : Form
{
// InPlaceHostingManager类,它可以实现实时下载安装应用程序包
InPlaceHostingManager appDown1 = null;
InPlaceHostingManager appDown2 = null;

// uris 提供统一资源标识符 (URI) 的对象表示形式和对 URI 各部分的轻松访问。
Uri app1Uri, app2Uri;

public frmMain()
{
InitializeComponent();

/* app1 和 app2 是 AppMain 的 Properties 中“设置”里的两个信息。应用程序设置允许动态地存储和检索应用程序的属性和其他信息。
* 例如,应用程序可以保存用户的颜色首选项,然后在下次运行时检索它们。*/
app1Uri = new Uri(AppMain.Properties.Settings.Default.app1);
app2Uri = new Uri(AppMain.Properties.Settings.Default.app2);

// 创建 InPlaceHostingManager 的一个新实例以下载和安装指定的应用程序,该应用程序可以是基于 Windows 窗体的独立应用程序,也可以是承载在 Web 浏览器中的应用程序。
appDown1 = new InPlaceHostingManager(app1Uri, false);
appDown2 = new InPlaceHostingManager(app2Uri, false);
}

private void frmMain_Load(object sender, EventArgs e)
{
// 开始下载第一个应用程序
// public event EventHandler<GetManifestCompletedEventArgs> GetManifestCompleted; 部署清单已下载到本地计算机时发生。
appDown1.GetManifestCompleted += appDown1_GetManifestCompleted;
// 在后台下载 ClickOnce 应用程序的部署清单,并在操作完成或遇到错误时引发事件。
appDown1.GetManifestAsync();

// 开始下载第二个应用程序
appDown2.GetManifestCompleted += appDown2_GetManifestCompleted;
appDown2.GetManifestAsync();
}

void appDown2_GetManifestCompleted(object sender, GetManifestCompletedEventArgs e)
{
if (e.Error != null)
{
MessageBox.Show(e.Error.Message);
return;
}

lblSecond.Text = "即将下载" + e.ProductName + "," + e.Version.ToString();

try
{
// AssertApplicationRequirements 确定 ClickOnce 应用程序是否具有合适的权限和平台依赖项,以便在本地计算机上运行。
// 参数: grantApplicationTrust: 如果为 true,应用程序将尝试将其权限提升至所需级别。
appDown2.AssertApplicationRequirements(true);
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
return;
}
// public event EventHandler<DownloadProgressChangedEventArgs> DownloadProgressChanged; 更改应用程序或清单下载状态时发生。
appDown2.DownloadProgressChanged += appDown2_DownloadProgressChanged;
// public event EventHandler<DownloadApplicationCompletedEventArgs> DownloadApplicationCompleted; 应用程序向本地计算机下载完成时发生。
appDown2.DownloadApplicationCompleted += appDown2_DownloadApplicationCompleted;

// 在后台下载应用程序更新。
// 异常: System.InvalidOperationException:
// 在 System.Deployment.Application.InPlaceHostingManager.GetManifestAsync()
// 和 System.Deployment.Application.InPlaceHostingManager.AssertApplicationRequirements()
// 方法之前调用此方法时引发。
appDown2.DownloadApplicationAsync();
}

void appDown2_DownloadApplicationCompleted(object sender, DownloadApplicationCompletedEventArgs e)
{
lblSecond.Text = "下载完成。";
}

void appDown2_DownloadProgressChanged(object sender, DownloadProgressChangedEventArgs e)
{
// e.ProgressPercentage 获取异步任务的进度百分比。返回结果: 指示异步任务进度的百分比值。
this.progressbarSecond.Value = e.ProgressPercentage;
this.lblSecond.Text = "已下载" + e.BytesDownloaded.ToString() + "字节,共" + e.TotalBytesToDownload.ToString() + "字节。";
}

void appDown1_GetManifestCompleted(object sender, GetManifestCompletedEventArgs e)
{

if (e.Error != null)
{
MessageBox.Show("出错:" + e.Error.Message); return;
}

lblFirst.Text = "即将下载" + e.ProductName + "," + e.Version.ToString();

try
{
appDown1.AssertApplicationRequirements(true);
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
return;
}

appDown1.DownloadProgressChanged += appDown1_DownloadProgressChanged;
appDown1.DownloadApplicationCompleted += appDown1_DownloadApplicationCompleted;

appDown1.DownloadApplicationAsync();
}

void appDown1_DownloadApplicationCompleted(object sender, DownloadApplicationCompletedEventArgs e)
{
lblFirst.Text = "下载完成。";
}

void appDown1_DownloadProgressChanged(object sender, DownloadProgressChangedEventArgs e)
{
this.progressbarFirst.Value = e.ProgressPercentage;
this.lblFirst.Text = "已下载" + e.BytesDownloaded.ToString() + "字节,共" + e.TotalBytesToDownload.ToString() + "字节。";
}
}
}


发布的设置:
...全文
979 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
永远在网上 2015-07-07
  • 打赏
  • 举报
回复
为什么我的VS2013无法发布到网站啊。根本没有这个项

求解你是怎么发布成功的
BruceLu 2014-09-27
  • 打赏
  • 举报
回复
嘻嘻,谢谢SP1234的解答,我用客户机访问主程序的时候,是拿 IP访问,没想到发布的时候是拿 localhost 发布的。 是没把概念搞清楚。太谢谢您的解答和指出我的问题了,我都试了老半天,也没想到。谢谢,谢谢,真是太谢谢了,刚改了下发布的地址就OK了。 嘿嘿。。。。
  • 打赏
  • 举报
回复
跟你贴的一大堆一大堆的代码都没有什么关系,你应该先把知识中千分之一的概念——如何访问http域名——概念搞明白。
  • 打赏
  • 举报
回复
晕死。既然从 localhost 安装和更新,其它机器怎么可能成功?

110,534

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧