2010-08-05 40 views
1

我想要一个离线的ClickOnce应用程序(它们可以从开始菜单运行它),但我希望我的应用程序的功能类似于在线应用程序(确保网页/服务器在那里运行)。通过这种方式,我可以卸载(卸载)ClickOnce应用程序,它将停止为最终用户工作,而无需转至1000台桌面。这是针对内部企业环境的,因此我们可以完全控制服务器,最终客户端等。我想杀了几个ClickOnce应用程序 - 我可以从代码访问ClickOnce“安装文件夹URL”吗?

世界各地都有很多客户。本质上,我想给他们一个消息,比如“这个应用程序的功能已经被移动到XXX应用程序,请用它来代替。”或者“这个应用程序已经退役了。”如果我可以从代码中获得安装文件夹URL,那么我可以在该目录中放置一个message.xml文件,该文件中将包含一些逻辑标签以完成此操作。如果该消息不存在(服务器脱机),我可能会使应用程序失败并指示用户联系其本地IT寻求帮助。

或者可以以不同的方式完成同样的事情吗?

+0

注意我找到了一篇关于移动URL的文章(这不正是我想要的),但它确实有一些关于如何获取发布和更新URL的源代码,我现在可以在我的应用程序中使用它。 http://robindotnet.wordpress.com/2010/01/17/how-to-move-a-clickonce-deployment/ – John 2010-08-05 16:46:45

回答

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更新可能抛出的异常有关。

这可以处理缺少的服务器案例 - 尽管它确实要求您在服务器退役之前将其置于适当位置。

+0

谢谢,这正是我们所需要的。我发现了一些源代码,并将其作为后续文章发布,但在Stackoverflow本身中有源代码是很好的! 我将不得不再问几个问题,并回答一些原因,我不能提出你的答案,因为我的代表不够高,但感谢这篇文章。 – John 2010-08-06 15:19:41

0

您可以创建应用程序的新版本,其中只包含一个消息框,指出“此应用程序已停用”并进行部署。

用户下次启动应用程序时,新版本将被下载显示您的消息框。

+0

这不能捕捉的一件事是,如果我们有部署的Web服务器有已经退休,这是我想要的另一个捕获。我知道我们可以移动部署,但它只适用于每天运行应用程序的人员。有时候人们可能不会运行这个应用程序几个星期或几个月,而且我想抓住那些在web服务器脱机后运行这个应用程序的人。 – John 2010-08-05 16:38:09

0

我所做的就是将这个问题的评论和我自己的一些想法结合起来,在下面提出这个答案。保存为HTML

XML文档(我们的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."); 
      } 
1

如果应用程序仅在线,则只能获取部署提供程序URL。否则它不可用。

除了移动部署,您还可以通过编程方式卸载并重新安装应用程序。

您将新版本(或者您想要安装的任何其他版本)部署到另一个URL。然后,将卸载/重新安装代码添加到旧版本并进行部署。当用户运行它时,他将得到一个更新,然后它将自行卸载并调用要安装的新部署。

卸载和重新安装ClickOnce应用程序的代码可以在MSDN上的证书到期日的文章中找到,Certificate Expiration in ClickOnce Deployment