среда, октября 14, 2009

Маленький такой сюрпризик

Казалось бы, два определения свойства эквивалентны:

   1: public StyleOfViewList ListViewStyle {
   2:     get { return listviewstyle; }
   3:     set { listviewstyle = value; }
   4: }
   5: StyleOfViewList listviewstyle = StyleOfViewList.GridStyle;
и
   1: public StyleOfViewList ListViewStyle { get; set; }

Тип свойств – обыкновенное перечисление

   1: public enum StyleOfViewList : byte { GridStyle = 1, PackedStyle = 2 }

Действительно, Рефлектор показывает для обеих конструкций практически одинаковый код, да и опыт с документацией подсказывают, что должно быть без разницы, какую из конструкций использовать… И так оно и есть, пока вторая конструкция не использована в определении свойства веб-части (с атрибутом [WebPartStorage]) – такая веб-часть становится неработоспособной.
Замена на первую конструкцию излечивает проблему. Нда…

Technorati Tags: ,

вторник, октября 06, 2009

Очередная попытка, бесплодная…

В очередной раз пытаюсь найти решение возникшей на ровном месте задачи получения информации с удалённых узлов Шарепойнта.

Собственно, особого разнообразия вариантов и нет – к неработающему способу обращения по механизму WebServices добавляется способ с использованием WCF. Смотрим, что получится:

   1: string endPointUrl = url.TrimEnd("/".ToCharArray()) + "/_vti_bin/Lists.asmx";
   2: ListsSoapClient client = new ListsSoapClient("ListsSoap", endPointUrl);
   3: client.ClientCredentials.Windows.AllowedImpersonationLevel = TokenImpersonationLevel.Impersonation;
   4: client.ClientCredentials.Windows.AllowNtlm = true;
   5: client.ClientCredentials.Windows.ClientCredential = new NetworkCredential(); 
   6: // from http://blogs.msdn.com/kaevans/archive/2009/03/10/calling-sharepoint-lists-web-service-using-wcf.aspx
   7: client.Open();
   8: XmlNode tst = null;
   9: try {
  10:     tst = client.GetListCollection();
  11:     Console.WriteLine(string.Format("success: {0} bytes", tst.OuterXml.Length));
  12: } catch (Exception err) {
  13:     Console.WriteLine(string.Format("error: {0}", err.Message));
  14: }


Результат, собственно, тот же, что в предыдущем опыте – локальные узлы (находящиеся на том же компьютере, откуда делается запрос, и на компьютерах, виртуальных или физических, в локальной сети) отдают данные как ожидается, при обращении к удалённым узлам (заведомо имеющим NTLM аутентификацию и разрешённый анонимный доступ) получаем исключение с сообщением “The HTTP request is unauthorized with client authentication scheme 'Ntlm'. The authentication header received from the server was 'NTLM'”. Весьма информативно, да…

Раскопки показывают, что народ с этим тоже пытается как-то бороться (безуспешно, впрочем), а корень зла описан в KB-статье. Оказывается, это борются так с “отражёнными атаками”, которые неизвестно, бывают ли, но средство борьбы надёжное – фиг прорвёшься. Что называется, лес рубят – щепки летят.

В общем, фантазия иссякает… Осталось попробовать водрузить на сервер свой сервис и пытаться через него как-то передавать нужное, но это никак не поправит ситуации, когда удалённый сервер – чужой.

Technorati Tags: ,