четверг, апреля 19, 2007

Быстрая вставка записей в SPList

Коллективным разумом на форуме дошли до способа вставлять записи, не извлекая всех имеющихся.

Определил вот такой метод:

const string EmptyQuery = "<Where><Eq><FieldRef Name='ID'/><Value Type='Integer'>0</Value></Eq></Where>";
public static SPListItem AddItem(SPList list) {
SPQuery q = new SPQuery();
q.Query = EmptyQuery;
return list.GetItems(q).Add();
}
И вместо конструкции
SPListItem newItem = list.Items.Add();
стал использовать
SPListItem newItem = AddItem(list);

На похожую тему - здесь


Размер шаблона сайта

http://blogs.msdn.com/joelo/archive/2007/03/15/you-learn-something-new-every-day-site-template-limit.aspx

Maxthon 2.0

Почти уже довели до ума китайские братья свой продукт. Хорошо работает, с памятью обходится намного аккуратнее, чем ИЕ7. Но криво пока работает с Live.com. В частности, как-то неправильно рендерид веб-части, в итоге апплеты-гаджеты не помещаются где надо.
Вот так оно выглядит в ИЕ7:








А вот так - в Maxthon 2:








Непорядок...




Folder of Document Library

Набрёл (ещё для Sharepoint-2003) на довольно заковыристый, но работающий способ определения имени папки, в которой размещаются файлы документов библиотеки library:

library.DefaultView.Url.Split("/".ToCharArray())[0];
Ничего более простого и прямого не обнаруживается (и в Sharepoint-2007 тоже). smile_thinking

XmListViewer 2007

Веб-часть XmListViewer 2007 предназначена для установки на узлах (сайтах) в составе Microsoft Office SharePoint Server 2007 или Microsoft SharePoint Services v.3.

Web part XmListViewer 2007 is intended for the installation on sites of Microsoft Office SharePoint Server 2007 or Microsoft SharePoint Services v.3.


Просмотры и закачки программы на SOFT@Mail.Ru

суббота, апреля 07, 2007

ToolStripMenuItem

Строятся на этих штуковинах-объектах разные менюшки в наследниках System.Windows.Forms.Form.

Но какие-то странные эти "объекты". Недавно захотел сократить их количество в программе за счёт повторного использования одинаковых объектов в главном меню формы и в контекстном меню. Но случился облом: объект оказывается только в последнем списке DropDownItems, куда он был добавлен. smile_embaressed В результате приходится объекты дублировать и добавлять копии в нужные коллекции.

Собственно, Студия только так и позволяет делать. smile_sad

пятница, апреля 06, 2007

четверг, апреля 05, 2007

Смешное...

Выясняется, что конструкцию

if (list is SPDocumentLibrary)
    node.Tag = item.File;
else 
    node.Tag = item;

нельзя записать в виде

node.Tag = (list is SPDocumentLibrary) ? item.File : item;

 Компилятор орёт гнусными выражениями, что типы разные и привести их не может. Тупой компиляторsmile_omg.

понедельник, марта 26, 2007

Загадки WSS 2007

Одну портальную "область" при конвертации сохранили очень похожей на 2003-ю версию. Зачем, непонятно. При этом все прочие бывшие "области" выглядят по-новому.





Удалённая отладка консольных приложений

Забавное решение получилось для субжа:

1: class Program {
2: const string debugKey = "-debug";
3: static void Main(string[] args) {
4: //debug
5: if (new List<string>(args).Contains(debugKey))
6: Console.ReadLine();
7: }
8: }

При запуске программы с параметром -debug в ком. строке она останавливается на строке №6 в ожидании нажатия на Enter. В это время и можно подцепиться отладчиком (напр., в Visual Studio) к процессу на удалённом компьютере и поставить нужные прерывания. После нажатия на Enter (в консоли удалённой машины) всё идёт обычным порядком.

WSS 2007 - очередная засада

Неправильно работает атрибут свойств веб-части WebPartStorage(Storage.Personal) - при отсутствии значения для текущщего юзера используется неизвестно чьё !!!

Пришлось делать проверку, есть ли у пользователя возможность сохранять значения свойств и при отсутствии оных использовать значение по умолчанию.

private bool UserCanWriteParameters() {
bool prevSave = this.SaveProperties;
bool prevCatch=SPContext.Current.Site.CatchAccessDeniedException;
bool retval = false;
SPContext.Current.Site.CatchAccessDeniedException = false;
try {
this.SaveProperties = true;
retval = true;
this.SaveProperties = prevSave;
} catch { }
SPContext.Current.Site.CatchAccessDeniedException = prevCatch;
return retval;
}

воскресенье, марта 25, 2007

Sharepoint Portal upgrade


Очередная засада.

При конвертации портала к версии MOSS2007 происходит преобразование областей (Area) в сайты (SPWeb) с сохранением структуры, существующей на момент процесса. Для обеспечения возможности использовать "портальные" адреса вида "/Cx/Cxx/area" организован редирект на вновь сформированные узлы. Где-то там установлено время ожидания до редиректа 5 сек. - как регулировать, можно ли уменьшить до нуля - ХЗ. Вот решил кто-то...
Кроме того, такие ссылки в разных местах порассованы и как автоматизировать их замену - абсолютно пока нет мыслей.

Иногда smile_omg конвертер зачем-то организует на новом узле ещё один редирект (страницу /Pages/UpgLandingPgRedir.aspx) с совсем уж неправильным адресом, в котором перепутаны Title и Url области. Не для всех узлов он такое делает (специально городил разные комбинации, закономерности так и не понял), но всегда - неправильно smile_angry.
К счастью, оказалось, что на узле есть и нормальные страницы /Pages/default.aspx, на которую при известной сноровке можно переключиться в свойствах сайта. Для автоматизации этого дела надо бы утилитку какую сочинить...

Добавлено: сочинил утилитку...

среда, марта 21, 2007

Server 2003 sp2 continued

После установки обнаружились неприятные эффекты в работе Sharepoint Portal 2003 - ровно такие же, какие получились при установке .NET v.2.

Вот, блин. smile_angry

Добавил: Upgrade до версии 2007 проходит нормально. Хоть какая радость.

четверг, марта 15, 2007

Server 2003 sp2

Выпустили вчера этот сервиспак (как где-то выразились - втихаря).

Описания толкового не приложили, а экспериментально выяснилось, что из ожидавшегося (и не сильно сложного, в общем-то) нету улучшенной графики для удалённого рабочего стола (RDP). При том, что клиентов, умеющих такой графикой пользоваться, раздали уже давно. smile_angry

Да и WMP11 могли бы приложить - многие сервером как десктопом пользуются, при разработке под ASP.NET 1.1 практически только так и можно жить.

понедельник, ноября 20, 2006

Индексация файлов в списках

В Sharepoint 2.0 существует досадное недоразумение - документы, размещённые в списках как присоединённые файлы, не индексируются через механизм полнотекстового поиска.

С помощью форума выяснилось, что дело в вычисляемом столбце Extension таблицы Docs. Для вычисления значения этого столбца используется формула
case when [DoclibRowId] IS NOT NULL AND charindex(N'.',[LeafName] collate Latin1_General_BIN)>(0) then right([LeafName],charindex(N'.',reverse([LeafName]) collate Latin1_General_BIN)-(1)) else N'' end

Зачем был вставлен выделенный фрагмент, неизвестно (может, ошибки какие пытались исключить?), но для присоединённых файлов это условие, как раз, и выполняется.

Заменой формулы на модифицированную

case when charindex(N'.',[LeafName] collate Latin1_General_BIN)>(0) then right([LeafName],charindex(N'.',reverse([LeafName]) collate Latin1_General_BIN)-(1)) else N'' end

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

суббота, сентября 23, 2006

Sharepoint и history.back

Давно висела задача не дать пользователям возможности уйти с открывшейся страницы не предусмотренным способом с сохранением введённых данных или с удалением незаполненных записей, а при помощи кнопки Back в браузере. Такой "уход" приводит к появлению пустых записей в списках и другим нежелательным эффектам типа воплей о пропавших данных.

При внимательном рассмотрении выяснилось, что "легальная" смена УРЛа происходит при помощи трёх элементов - Button, LinkButton и HyperLink. Для каждого из них требуется специфическое решение для занесения в history адреса перехода (что и даёт эффект "очистки" истории и "блокировки" кнопки Back).

HyperLink

Для этого элемента просто переопределяем реакцию на нажатие:

//Настройка элемента
HyperLink link = new HyperLink();
l
ink.Text = ...;
link.NavigateUrl = ...;
//обработчик нажатия на клиенте
link.NavigateUrl = "javascript:window.location.replace('"+link.NavigateUrl+"')";

LinkButton

Для этого элемента кроме переопределения реакции на нажатие требуется добавить на страницу скрипт и передать в элементе hidden адрес перехода (такая передача требуется на случай, если таких элементов на странице больше одного):

//Настройка элемента
LinkButton linkButton =
new LinkButton();
linkButton.Text = ...;
linkButton.Click += new EventHandler(linkButton_Click);
//обработчик нажатия на клиенте
linkButton.Attributes.Add("onclick", "javascript:SetBack('"+this.ClientID+"')");
//функция настройки адреса перехода
string _backScript = @"<SCRIPT language=""javascript"" type=""text/javascript"" >
var __BackUrl__="""";
function SetBack(id){
var hf=document.getElementById(""_backurl_""+id);
if(hf){ __BackUrl__=hf.value; }
} </SCRIPT>"
;
if(!this.Page.IsClientScriptBlockRegistered("_SetBack"))
   
this.Page.RegisterClientScriptBlock("_SetBack", _backScript);

//функция подмены адреса history.back
string _OnUnloadScript = @"<SCRIPT language=""javascript"" type=""text/javascript"" FOR=window EVENT=onunload>
if(__BackUrl__ != """"){window.location.replace(__BackUrl__);}
</SCRIPT>"
;
if(!this.Page.IsStartupScriptRegistered("_OnUnload"))
   
this.Page.RegisterStartupScript("_OnUnload", _OnUnloadScript);

//адрес перехода
this.Page.RegisterHiddenField("_backurl_" + this.ClientID, <url>);

Button

Для элемента Button настройки аналогичны элементу LinkButton.

 

После таких модификаций переходы по нажатию на такие элементы приводят в "блокировке" кнопки Back браузера.

Естественно, нашлась ложка дёгтя - при наличии на странице других элементов, не обладающих таким же поведением, "блокировка" кнопки Back может быть нарушена. Таким элементом, например, является пункт меню "Изменить общую веб-часть..." :-(

суббота, сентября 16, 2006

XmlViewer и Office Extensions

Объявили ещё зимой конкурс, выставил на него в апреле примочку, до сих пор её "тестируют". Скоро уже никому не надо станет - новая версия Шарепойнта на подходе.

Решил на Гугле вывесить, может, кому пригодится...

P.S. Это веб-часть такая для Шарепонт'а.

XmlViewer and Office Extensions

MSFT have declared even in the winter competition, I have exposed on it in April a lotion, till now "testing". Soon nobody becomes already necessary - new version of Sharepoint on the approach.

Has decided on Google to hang out, maybe to whom it is useful...

It is useful webpart for Sharepoint 2003...

Little toy

For rest and a relaxation has composed utility for copying files on post servers.

Now backup of my the projects I do on a disk by nnbackup and on mail servers (gmail, hotmail, mail.ru) by eMailBackup - there should be an advantage of greater boxes, not only a spam to collect...

Игрушечка

Для отдыха и расслабления сочинил утилитку для копирования файлов на почтовые серверы.

Теперь бекап своих проектов делаю на диск при помощи nnbackup и на почту (gmail, hotmail, mail.ru) при помощи eMailBackup - должна же быть польза от больших ящиков, не только спам собирать...

суббота, сентября 02, 2006

Правка настроек.

В приложении использую конфиг-файл, в котором пользователи пишут значения руками. Естественно, ляпают. Как правило, лишние символы в конце и в начале. Но соответствующие свойства класса Settings оказываются readonly (настройки для всего приложения). Да к тому же тип у настроек - StringCollection.

В итоге пришлось соорудить функцию

public delegate bool goodString(string o);
public delegate string clearString(string o);

public
StringCollection CloneCollection(StringCollection src, goodString goodFunc, clearString clearFunc) {
  
StringCollection rv = new StringCollection();
  
foreach (string t in src) {
     
string tc = clearFunc == null ? t : clearFunc(t);
     
if (goodFunc == null || goodFunc(tc))
         rv.Add(tc);
   }
  
return rv;
}

Вызов такой:

setsSearchSites = CommonTools.CloneCollection(sets.SearcSites,
delegate(string s) { return !string.IsNullOrEmpty(s); },
delegate(string s) { return s.Trim().TrimEnd("/".ToCharArray()); });

А в приложении пользуюсь уже исправленной копией параметров, с вычищенными пробелами и слешами на концах.

суббота, августа 19, 2006

Шутки от MS SQL Server - 2

(по крайней мере, MS SQL 2005 так шутит)

Выяснилось, что даже при указании для некоторого NOT NULL поля таблицы значения по умолчанию в это поле нельзя записывать null.

Т.е., если поле col1 определено как NOT NULL default ('anystring'), то нельзя написать INSERT INTO (col0, col1) VALUES (@p0, @p2) и параметру @p2 присвоить null (DBNull.Value). Тут получится выкидыш-exception - низя в такое поле совать NULL. В этой ситуации поле нужно вовсе в списки не упоминать, тогда ему будет присвоено значение по умолчанию.

Как-то это неочевидно, а в BOL если и написано об этом, то где-то весьма далеко - специально искал, да не нашёл.

Шутки от MS SQL Server

(по крайней мере, SQL EveryWhere так шутит)

Запоминаю в таблице данные файла (имя и дату изменения), чтоб в дальнейшем повторно этот файл не обрабатывать. Фокус вылезает при извлечении запомненной даты и сравнении её с датой из файловой системы. Если файл не изменялся, результат такого сравнения - как у блондинки: то ли больше, то ли меньше. Выяснилось, что при сохранении пропадают сколько-то миллисекунд (округление такое, что ли?)... Пришлось изобретать округление до секунды и пользоваться такими округлёнными значениями.

public static DateTime RoundToSecond(DateTime date) {
           
return new DateTime(
            date.Year, date.Month, date.Day,
           date.Hour, date.Minute, date.Second);
}

пятница, августа 18, 2006

Пост из Writer

Новую примочку придумали. Поглядим...

Как-то не сразу постится...

private void DoFile(string path) {
         iisLogsTested++;
        if (TestFileToProcess(path)) {
              log.WriteFileWithTimeStamp(
"Processing of file [{0}]", path);
              ProcessFile(path);
        }
  }

Нормально, вроде. Пользоваться можно.

P.S. Одновременно с этой примочкой поставили тулбар, с которым моя машина не справляется :-( Пришлось снести...

вторник, августа 08, 2006

Бесплатный антивирус в Windows 2003

Жлобятся производители антивирусов дать возможность  запускать бесплатные версии на Windows 2003. А без антивируса как-то неуютно.
Поднапрягся,  настроился на работу с ClamWin - бесплатный, по размеру небольшой, Outlook проверяет на ходу, базы обновляют довольно оперативно, да и плохого про него не слышно. Одного не хватает - нет резидентного файлового сканера. Да и программка обновления баз в трее великовата.  
Сделал вот как: 
1. Программку из трея прогнал, заменил её задачей nnCron'а :Time: 17 */3  * * * *
Action:
ONLINE?IFStartIn: "G:\avir\.clamwin" ShowMinimized NormalPrioritySTART-APP: D:\Program Files\ClamWin\bin\freshclam.exe --config-file=G:\avir\.clamwin\freshclam.cfg --log=G:\avir\.clamwin\log\ClamUpdateLog.txt --datadir=G:\avir\.clamwin\db --quietTHEN
2. Вместо сканера настроил программку LogMon на сканирование новых файлов в каталоге My Downloads (сюда загружаю файлы из Сети). Команда для этого:
D:\Program Files\ClamWin\bin\clamscan.exe -d G:\avir\.clamwin\db --tempdir=g:\temp\ClamvByaka - l G:\avir\.clamwin\log\ClamScanLog.txt "%File="DP\\N.E"" 
3. Сгружальщик FlashGet настроил на выполнение для каждого загруженного файла команды сканирования D:\Program Files\ClamWin\bin\clamscan.exe -d G:\avir\.clamwin\db -- tempdir=g:\temp\ClamvByaka -l G:\avir\.clamwin\log\ClamScanLog.txt
Жить можно...

пятница, июля 28, 2006

Ghost from SharePoint

Потребовалось сделать обход всех существующих структур Шарепойнта и достать все библиотеки документов и рисунков. Выяснилось, что в базе существует много объектов, которых как бы и нет (на страницах не отображаются), но в объектную модель попадают. На них вылетают всякие исключения, которых вовсе не ожидаешь, но которые в итоге следует учитывать. После всех этих «учётов» ожидаемый метод из 10 строк вылился вот во что (здесь log – мой собственный логгер, к делу не относится):
 
/// <summary>
///
Выдаёт все библиотеки документов

/// </summary>

/// <returns>очередную библиотеку </returns>

/// <remarks>вызывать в цикле вида

/// foreach (SPDocumentLibrary lib in DocLibs()){ ... }

/// </remarks>

IEnumerable< SPDocumentLibrary>DocLibs() {

    SPGlobalAdmin ga = new SPGlobalAdmin();

    string[] vsNames = ga.VirtualServerNames;

    for(int vs=0;vs<vsNames.Length;vs++){

        SPVirtualServer srv = null;

        try {

            srv = ga.VirtualServers[vs];

        } catch (Exception err) {

            log.WriteException(err, false, vsNames[vs], 68);

            continue;//next VirtualServer

        }

        int nSites = -1;

        try {

            nSites = srv.Sites.Count;

        } catch { }

        if (nSites > 0) {

            string[] siteNames = new string[srv.Sites.Count];

            for (int s = 0; s < siteNames.Length; s++)//fill names

                try {

                    siteNames[s] = srv.Sites[s].Url;

                } catch {

                    siteNames[s] = null;

                }

            foreach (string siteName in siteNames) {

                if (string.IsNullOrEmpty(siteName)) continue; //next Site

                SPSite site = null;

                try {

                    site = new SPSite(siteName);

                } catch (Exception err) {

                    log.WriteException(err, false, siteName, 69);

                    continue; //next Site

                }

                site.CatchAccessDeniedException = false;

                string[] webNames;

                try {

                    webNames = site.AllWebs.Names;

                } catch (Exception err) {

                    log.WriteException(err, false, siteName, 691);

                    continue; //next Site

                }

                foreach (string webUrl in webNames) {

                    SPWeb web = null;

                    try {

                        web = site.AllWebs[webUrl];

                    } catch (Exception err) {

                        log.WriteException(err, false, webUrl, 70);

                        continue;//next web

                    }

                    int listsCount=-1;

                    try {

                        listsCount=web.Lists.Count;

                    } catch { }

                    if (listsCount > 0) {

                        string[] listNames = new string[listsCount];

                        for (int l = 0; l < listsCount; l++) {

                            try {

                                listNames[l] = web.Lists[l].Title;

                            } catch (Exception err) {

                                log.WriteException(err, false,

                                         string .Format("List number {0}", l + 1), 71);

                                 listNames[l] = string.Empty;

                             }

                         }

                         foreach (string listName in listNames) {

                             if (!string.IsNullOrEmpty(listName)) {

                                 SPList list = null;

                                 try {

                                     list = web.Lists[listName];

                                 } catch (Exception err) {

                                     log.WriteException(err, false, listName, 72);

                                     continue; //next List

                                 }

                                 if (list != null && list is SPDocumentLibrary)

                                     yield return list as SPDocumentLibrary;

                             }

                         }

                     }

                     web.Dispose();                }

                site.Dispose();            }

        }

    }

    ga.Dispose();

}

понедельник, июля 24, 2006

Опять прикол от SharePoint

Нужно было воспользоваться свойством списка list.LastItemModifiedDate - gets the date and time that an item, field, or property of the list was last modified.

При этом время выдаётся по Гринвичу независимо от региональных установок на объектах SPWeb и SPSite. Выкрутился использованием конструкции
  list.ParentWeb.RegionalSettings. TimeZone.UTCToLocalTime(list.LastItemModifiedDate )

В это же самое время для отдельных items списка данные, например, list.Items [0]["Modified"], выдаются в соответствии с региональными установками.

Вот же, блин. Горелый.

четверг, июля 13, 2006

Встраиваемые СУБД

В проекте потребовалось сохранять промежуточные данные, чтоб потом их считывать. Можно, конечно, сериализовать и сохранять в файл (двоичный или xml), но подумалось, что попользоваться базой данных проще и привычней. База там, естественно, есть, однако это MS SQL Server, занятый своей собственной неслабой работой, поэтому сразу решил поискать чего-то встраиваемого в саму программу, небольшого размера и, желательно, бесплатного.

Вот результаты изысканий:

Vieka eSQL – бесплатная для любого применения, платить нужно только при использовании в продажных продуктах для мобильных девайсов. Для использования требуются библиотеки размером ок. 450 кб. Наследник SQLite, имеет минимальный набор типов, с небольшими базами работает быстро (при размерах в сотни мегабайт народ жалуется на тормоза). Имеет интерфейс с .NET, работает с SQL-92. База однофайловая. Требуются операции сжатия базы. Имеется пример, который получается изменять – бум смотреть в качестве кандидата.

db4o
– распространяется по GPL. Для использования требуются библиотеки размером ок. 860 кб. Имеется интерфейс с .NET 2.0 и .NETCF 2.0. Объектная база. Народ жалуется на задержки при открытии файла базы. База однофайловая. Мало какой-либо хорошей информации, хотя имеющиеся примеры работают.

SQL Server Everywhere Edition – пока что существует в виде CTP, но к концу года обещают выпустить релиз, да ещё и бесплатный. Для использования требуются библиотеки размером ок. 1.5 Мб. Имеется интерфейс с .NET 2.0 и .NETCF 2.0. Программная модель – как у SQL Server 2005. База однофайловая. Штука привлекательная, надо её поизучать на будущее.

VistaDB – продаётся за деньги, но лицензия позволяет распространять использующий базу продукт бесплатно. Для использования требуются библиотеки размером ок. 650 кб. Имеется интерфейс с .NET 2.0, работает с SQL-92. Также имеется интерфейс DDA – прямой доступ к данным, быстрая работа на низком уровне с таблицами, записями и т.д. Набор типов почти как у SQL Server. База однофайловая. Примеры работают, поддаются изменению.

Пост из Word 2007

Обнаружилась встроенная фича – постить в блоги.

Щас и проверим.


Это наляпано в Word’е 2007 beta2

Всё, вроде, ничего, даже постит в блоги на Sharepoint 2007. Повторный пост воспринимается как новый, в Шарепойнте заменяет старый.

среда, июля 05, 2006

Sharepoint 2007

После установки Office Sharepoint Server:
 
в Рефлекторе вот такое -
[Obsolete( "This class is obsolete.")]
public class Area{ ... }
И все портальные структуры тоже. Слава богу, что от чепухи отказались.

Добавились разные хитрые шаблоны узлов и сервисы, но на моём тестовом "сервере" они не фурычат (жидковата машинка, конечно).
 

вторник, июля 04, 2006

Sharepoint 2007 (WSS v.3)

Из того, что пока увиделось (повозился с WSS 3):
  • блог и WiKi - вполне рабочие сайты.
  • Discussion - уже совсем на форум похожа, хоть с мелкими глюками.
  • Списки - в ссылочных полях можно делать множественный выбор, список с другого сайта подключить не получилось (хотя и были разговоры о подобных пряниках).

 

четверг, июня 29, 2006

Срок службы Windows Server 2003.

Экспериментально установился, на собственной шкуре (вернее, на компьютере).
 
Установлена система была в 2002 г. (upgrade с Server 2000 через RC). Машина использовалась в качестве стенда:
  • Sharepoint 2001
  • Sharepoint 2003, sp1, sp2
  • MS SQL 2000, sp1, sp3
  • MS SQL 2005, sp1
  • Oracle 7,8,9
  • Pervasive
  • Галактика разных версий
  • антивирусы/firewall'ы разные
  • всякое другое по мелочам (чистилки реестра, дефрагментаторы, архиваторы и проч. ФАРы)
Ставилось, сносилось, работало в разнообразных комбинациях. Переустанавливалась в режиме обновления с сохранением всех настроек один раз в начале 2006 г.
 
Вчера пришлось переустановить с полной очисткой диска - новый софт уже не ставился - .NET 3, Sharepoin 2007.
Бум смотреть, на сколько теперь хватит.

среда, июня 28, 2006

Приколы SQL 2005.

При установке получил сообщение:
 
Could not get performance counter registry info for msftesqlFD for instance SQL2K5 due to the following error : The operation completed successfully
 
Хи-хи. 

понедельник, июня 26, 2006

Приколы продолжаются

Друзья из MS статейку на днях вывесили. Теперь придётся код перебирать, чтоб ихние рекомендации реализовать.

In scenarios in which you use SharePoint objects extensively―for example, in SharePoint sites that use custom Web Parts―you can cause the following unusual behaviors by not disposing of those objects that can be disposed of:
  • Frequent recycles of the Microsoft Windows SharePoint Services application pool, especially during peak usage
  • Application crashes that appear as heap corruption in the debugger
  • High memory use for Microsoft Internet Information Services (IIS) worker processes
  • Poor system and application performance

Several of the Windows SharePoint Services objects, primarily the SPSite class and SPWeb class objects, are created as managed objects. However, these objects use unmanaged code and memory to perform the majority of their work. The managed part of the object is small; the unmanaged part of the object is much larger. Because the smaller managed part of the object does not put memory pressure on the garbage collector, the garbage collector does not release the object from memory in a timely manner. The object's use of a large amount of unmanaged memory can cause some of the unusual behaviors described earlier. Calling applications that work with IDisposable objects in Windows SharePoint Services must dispose of the objects when the applications finish using them. You should not rely on the garbage collector to release them from memory automatically.

Вроде, пару лет назад всего этого никто не знал... И, самое смешное, и в "новой" версии всё так же и осталось.

воскресенье, июня 18, 2006

Indigo(WCF) & Win Mobile 5.0

Не нашлось способа подключиться к WCF-сервису в программе для Windows Mobile 5.0.

Облом происходит на строчке
EndpointAddress address = new EndpointAddress (svcUri, null);
Рассказывает, что cannot convert from 'System.Uri [g:\Program Files\Microsoft.NET\SDK\CompactFramework\v2.0WindowsCE\System.dll]' to 'System.Uri'
Получается, что эти самые URI в "большом" FW и в CF - совсем уж непохожие.
В общем, опять недоделка...
Бум пока через веб-сервис, по старинке.

четверг, июня 15, 2006

PROMT.

На форуме навели на мысль - сделать в портале "встроенный переводчик". Получилось не хуже Research-панели от Офиса.

пятница, июня 09, 2006

Sharepoint - очередной прикол.

При чтении данных списка посредством вызова метода GetList веб-сервиса http://Server_Name/[sites/][Site_Name/]_vti_bin/Lists.asmx получаем исключение с сообщением "There is an error in XML document (94, 5)." И всё.
Выяснилось, что в текстовом поле списка имеется символ \0x31. Откуда взялся, неведомо, да и не повод это для такого поведения. Тем более, при чтении через объектную модель ничего плохого не происходит. Рисуется квадратик на месте символа.

P.S. Что означают числа 94,5 в сообщении, выяснить так и не удалось. India forever.

среда, мая 24, 2006

WSS Login

Многие сомневаются в существовании означенной веб-части. Вот же она - в виде кнопки "Вход":


вторник, апреля 18, 2006

Sharepoint WebParts in VS 2005

Последнее усилие получить что-то пристойное в смысле использования Visual Studio 2005 для разработки WebPart'ов для Sharepoint'а.
Вот здесь - шаблон проекта. С его помощью создаётся вполне работоспособное хозяйство для разработки и компиляции веб-частей.
Где-то также нашлись codesnippet'ы, но не очень интересные, по-правде. В общем, для редактирования 2005-я студия получше будет.
Только вот с отладкой - никак, 2005-я нужного режима вовсе не имеет. Сделал проект на 2003-й Студии, включил туда тексты (отладка не запускается без компиляции) - и можно отлаживать. Если не очень часто это делать - пригодно для жизни получилось.

воскресенье, апреля 16, 2006

Очередной прикол Sharepoint

При копировании списков для полей типа SPFieldNumber использовал конструкцию:

newfield.MaximumValue = field.MaximumValue;

newfield. MinimumValue = field.MinimumValue;

Первая строчка проходит, на второй же вылетает исключение с сообщением типа "Значение сильно большое или сильно маленькое для типа Double". Проходит только значение по умолчанию (ок. -1e308, когда значение не устанавливалось), если в исходном списке такое значение было установлено, то кранты. Через Reflection нужное значение присвоить тоже не удаётся. :-(
Хуже того, исполнение первой строчки вызывает то же исключение при попытке отредактировать это поле в интерфейсе _layouts/1049/FldEdit.aspx.

Пришлось в Админе от установки этих свойств отказаться с выдачей предупреждения.

Вот, блин.