我想要一个离线的ClickOnce应用程序(他们可以从“开始”菜单运行它),但我希望我的应用程序的功能类似于在线应用程序(确保网页/服务器在那里运行)。通过这种方式,我可以取消(卸载)ClickOnce应用程序,它将停止为最终用户工作,而无需转到1000的桌面。这适用于内部企业环境,因此我们可以完全控制服务器,最终客户等。
全世界有很多客户。基本上,我想给他们一个消息,如“此应用程序功能已移至XXX应用程序,请改为使用它”。或者“此应用程序已退役。”如果我可以从代码中获取安装文件夹URL,我可以在该目录中放置一个message.xml
文件,其中包含一些逻辑标记以实现此目的。如果该消息不存在(服务器脱机),我可能会使应用程序正常失败并指示用户联系其本地IT部门寻求帮助。
或者可以用不同的方式完成同样的事情吗?
答案 0 :(得分:1)
我使用以下代码来解决部分问题:
try
{
// The next four lines probe for the update server.
// If the update server cannot be reached, an exception will be thrown by the GetResponse method.
string testURL = ApplicationDeployment.CurrentDeployment.UpdateLocation.ToString();
HttpWebRequest webRequest = WebRequest.Create(testURL) as HttpWebRequest;
webRequest.Proxy.Credentials = CredentialCache.DefaultCredentials;
HttpWebResponse webResponse = webRequest.GetResponse() as HttpWebResponse;
// I discard the webResponse and go on to do a programmatic update here - YMMV
}
catch (WebException ex)
{
// handle the exception
}
可能还有一些其他有用的例外 - 我在我使用的代码中有更多的例外,但我认为其余的都与ClickOnce更新可以抛出的异常有关。
处理丢失的服务器案例 - 虽然它确实要求您在服务器退役之前主动将其放置到位。
答案 1 :(得分:1)
如果应用程序仅在线,则只能获取部署提供程序URL。否则它不可用。
除了移动部署之外,您还可以以编程方式卸载并重新安装该应用程序。
您将新版本(或您要安装的任何内容)部署到另一个URL。然后,将卸载/重新安装代码添加到旧版本并进行部署。当用户运行它时,他将获得更新,然后它将自行卸载并调用要安装的新部署。
有关卸载和重新安装ClickOnce应用程序的代码,请参阅MSDN上有关证书过期的文章 Certificate Expiration in ClickOnce Deployment 。
答案 2 :(得分:0)
您可以创建一个新版本的应用程序,其中只包含一个消息框,说明“此应用程序已停用”并进行部署。
下次用户启动应用程序时,将下载新版本,显示您的消息框。
答案 3 :(得分:0)
我所做的是将这个问题的评论结合起来,并将我自己的一些评论与下面的答案结合起来。
XML文档保存为HTML(我们的Web服务器不允许XML传输):
<?xml version="1.0" encoding="utf-8"?>
<appstatus>
<online status="true" message="online"/>
</appstatus>
然后我从上面读取了以下代码,并使用它来查看应用程序是否应该关闭:
string testURL = "";
try
{
// Probe for the update server.
// If the update server cannot be reached, an exception will be thrown by the GetResponse method.
#if !DEBUG
testURL = ApplicationDeployment.CurrentDeployment.UpdateLocation.ToString() + "online.html";
#else
testURL = "http://testserver/appname/online.html";
#endif
HttpWebRequest webRequest = WebRequest.Create(testURL) as HttpWebRequest;
webRequest.Credentials = CredentialCache.DefaultCredentials;
HttpWebResponse webResponse = webRequest.GetResponse() as HttpWebResponse;
StreamReader reader = new StreamReader(webResponse.GetResponseStream());
XmlDocument xmlDom = new XmlDocument();
xmlDom.Load(reader);
if (xmlDom["usdwatcherstatus"]["online"].Attributes["status"].Value.ToString() != "true")
{
MessageBox.Show(xmlDom["usdwatcherstatus"]["online"].Attributes["message"].Value.ToString());
this.Close();
return;
}
}
catch (WebException ex)
{
// handle the exception
MessageBox.Show("I either count not get to the website " + testURL + ", or this application has been taken offline. Please try again later, or contact the help desk.");
}