Я хочу убить несколько приложений ClickOnce - могу ли я получить доступ к URL-адресу "папки установки" ClickOnce из кода? - PullRequest
1 голос
/ 05 августа 2010

Я хотел бы иметь автономное приложение ClickOnce (они могут запускаться из меню «Пуск»), но я бы хотел, чтобы мое приложение функционировало аналогично онлайн-приложению (убедитесь, что веб-страница / сервер запущена).Таким образом, я могу снять (удалить) приложение ClickOnce, и оно перестанет работать для конечных пользователей, не обращаясь к тысячам рабочих столов.Это для внутренней корпоративной среды, поэтому мы имеем полный контроль над серверами, конечными клиентами и т. Д.

В мире много клиентов.По сути, я хотел бы дать им сообщение типа «Эта функциональность приложения была перенесена в приложение XXX, используйте ее вместо этого».Или «Это приложение было удалено».Если бы я мог получить папку установки URL из кода, у меня мог бы быть файл message.xml, расположенный в этом каталоге, в котором были бы некоторые логические теги для выполнения этого.Если это сообщение отсутствует (сервер отключен), я мог бы изящно завершить работу приложения и поручить пользователю обратиться за помощью к местным ИТ-специалистам.

Или это можно сделать другим способом?

Ответы [ 4 ]

1 голос
/ 07 августа 2010

URL-адрес поставщика развертывания можно получить только в том случае, если приложение доступно только онлайн.В противном случае он недоступен.

Помимо перемещения развертывания, вы можете программно удалить и переустановить приложение.

Вы развертываете новую версию (или то, что хотите вместо этого установить) по другому URL-адресу.Затем вы добавляете код удаления / переустановки в старую версию и развертываете ее.Когда пользователь запустит его, он получит обновление, а затем сам деинсталлирует и вызовет установку нового развертывания.

Код для удаления и переустановки приложения ClickOnce можно найти в статье о сертификатесрок действия в MSDN, Срок действия сертификата в развертывании ClickOnce .

1 голос
/ 05 августа 2010

Я использовал следующий код для решения части вашей проблемы:

            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 голосов
/ 06 августа 2010

Что я сделал, так это объединил комментарии к этому вопросу и немного своих собственных, чтобы получить ответ ниже.

XML-документ, сохраненный как HTML (наши веб-серверы не допускают передачи 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."); 
            }
0 голосов
/ 05 августа 2010

Вы можете создать новую версию своего приложения, которая содержит только окно сообщения с надписью «Это приложение удалено», и развернуть его.

При следующем запуске приложения пользователем будет загружена новая версия с указанием вашегоMessageBox.

...