2015-10-22 3 views
0

Я хочу, чтобы мои клиенты могли создавать свои собственные страницы в Kentico с помощью выделенных виджетами. Таким образом, они создают страницу, выбирают шаблон с зоной виджетов, а затем размещают любой виджет, который они хотят.Kentico: получение визуализированного содержимого страницы программно

Что я хочу сделать, я хочу разработать виджет, который извлекает содержимое одной из этих страниц, а затем обрабатывает/инкапсулирует его. Или в более технических словах, я хотел бы иметь содержимое страницы как строку HTML в моем классе виджетов.

К сожалению, API Kentico не предоставляет метод извлечения содержимого страницы или, по крайней мере, я не мог понять, как это сделать. Существует веб-часть Kentico, «заполнитель страниц», которая делает именно то, что мне нужно, однако я не могу найти способ использовать ее функциональность внутри виджета. Я предположил, что могу использовать тег cms:CMSPagePlaceholder внутри моего widget.ascx, но по какой-то причине он невидим (хотя я могу выбрать множество других элементов управления из пространства имен Kentico CMS).

Я также пробовал получать контент через класс System.Net.WebClient - без успеха. Все, что я получаю

(401) Несанкционированное

Я могу открыть данный URL в браузере, однако. (Бонусные баллы для вас, если вы можете сказать мне, почему это так. Я наткнулся на эту ошибку 401 в другом контексте (обращаясь к промежуточной веб-службе) и не могу понять, почему. То же самое с постановкой: я могу получить доступ к URL-адрес промежуточного веб-сервиса в браузере, но не изнутри Kentico ... Очень странно)

Некоторые справочные данные: Я разрабатываю клиент, где хранятся мои физические файлы, и я обращаюсь к общей базе данных на сервере , Физические файлы в основном дублируют мой клиент и сервер. Я только подталкиваю измененные файлы веб-частей. У экземпляра Kentico сервера есть другой URL-адрес, чем экземпляр Kentico моего клиента, и я перенаправляю URL-адреса моего клиента на сервер (через настройку «сайт»).

Короче говоря, как получить визуализированный HTML-документ для моего виджета? Если бы это было возможно, это облегчило бы мою жизнь.

ответ

1

Попытка визуализации содержимого страницы программно может быть очень хлопотной. Я бы сказал, что подход с WebClient - единственный разумный путь. В зависимости от метода проверки подлинности вашего экземпляра Kentico вы должны предоставить правильный набор учетных данных, чтобы вы не получили ошибку 401. Если вы используете проверку подлинности Windows, вам необходимо предоставить веб-запрос с объектом NetworkCredential. Если вы используете проверку подлинности с помощью форм, вы можете скопировать файлы cookie, чтобы запрос «выдавал себя за себя» зарегистрированного пользователя.

Это пример аутентификации System.Net.WebClient против ASP.NET Forms аутентификации:

public class CookieReplicatingWebClient : WebClient 
{ 
    protected override WebRequest GetWebRequest(Uri address) 
    { 
     var request = (HttpWebRequest)base.GetWebRequest(address); 
     if (request != null) 
     { 
      HttpCookieCollection cookies = HttpContext.Current.Request.Cookies; 

      CookieContainer cookieContainer = new CookieContainer(); 

      for (int i = 0; i < cookies.Count; i++) 
      { 
       // Clone cookies 
       HttpCookie httpCookie = cookies[i]; 
       if (httpCookie != null) 
       { 
        cookieContainer.Add(new Cookie { Domain = request.RequestUri.Host, Name = httpCookie.Name, Path = httpCookie.Path, Secure = httpCookie.Secure, Value = httpCookie.Value }); 
       } 
      } 

      request.CookieContainer = cookieContainer; 
     } 
     return request; 
    } 
} 

protected void Page_Load(object sender, EventArgs e) 
{ 
    using (WebClient client = new CookieReplicatingWebClient()) 
    { 
     // Request secured area (of Kentico's Corporate sample site) 
     string htmlCode = client.DownloadString("http://localhost/Kentico82/Partners/Gold-partners.aspx"); 
    } 
} 
+0

Спасибо за ваш ответ! Ваш код очень полезен. – RolandK

0

Лучше на мой взгляд, использовать HtmlAgilityPack.

С помощью этого инструмента вы можете легко управлять всей отображаемой страницей.

private HtmlDocument GetDocument(string url) 
{ 
    HtmlWeb page = new HtmlWeb(); 

    return page.Load(url); 
} 

Это вернет объект, представляющий различные части html. Например, если вы хотите, чтобы получить заголовок страницы, то вы:

string header = document.DocumentNode.SelectSingleNode("//header").OuterHtml; 

Надеется, что это помогает!

Смежные вопросы