МОСС / Сервер форм InfoPath (InfoPath 2007) списком производительности

Дополнительные категории: InfoPath

Резюме: InfoPath 2007 формы, развернутого на сервере MOSS предоставляет раскрывающийся список поставщиков, привязаны к списку пользовательских Мосс. При выборе поставщика, правила назначить значения полей несколько текстовых полей, таких как имя продаж, адрес, город, государство, ZIP и phone. Производительность это ужасно. Мы замечаем, что производительность ухудшается (в нелинейных моды) для каждого дополнительного поля мы обновление таким образом. Т.е., Если мы просто обновить имя продаж, Он принимает [x] количество времени. Если мы обновление продаж, Адрес1, Адрес2, город, государство, Индекс, Он принимает 10 раз дольше.

Решение: Написать веб-службы (примеры кода можно найти Здесь) Это передается имя поставщика и возвращает обратно детали поставщика. Затем, назначить поля таким образом. Хотя это, кажется, слишком медленно, Существует нет заметной разницы в производительности, когда мы 1 поле против 8 поля. В качестве дополнительного бонуса, Пользователи получают прохладно «соединение с сервером" Сайлоны эффект, пока они ждут для вызова и потреблять службы результаты формы.

МОСС: Произошло исключение. (Исключение из HRESULT: 0x 80020009 (DISP_E_EXCEPTION))

ОБНОВЛЕНИЕ: Мы никогда не определили основную причину этой проблемы, и он никогда не поверхности снова.

Мы заметили в ходе осуществления развития сайта, что внезапно, два пользователя не могут получать доступ к коллекции узлов. Эти счета могут проходить проверку подлинности на основной сайт, Однако при попытке доступа к определенного семейства сайтов, они просто получаю пустой экран. Ошибки не отображаются, Белая пустая страница.

Войдите в систему как администратор семейства сайтов и попробуйте добавить один из этих пользователей как администратор сайта и на этот раз, После нажатия «ОК», Мы получаем это сообщение:

Произошло исключение. (Исключение из HRESULT: 0x 80020009 (DISP_E_EXCEPTION))

Мы провели некоторое время исследовать это и, к сожалению, не придумать что-нибудь полезное. Там были некоторые сообщения в журнале диагностики, но это было трудно точно соотносить их с этим вопросом.

В конце концов, Мы Удаление семейства сайтов и заново ее и что решить ее.

Если я выяснить, что это вызвало в будущем, Я буду обновлять этот пост.

МОСС: Итерации пользовательских списков и возвращения отфильтрованных данных в InfoPath

Бизнес-сценарий:

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

Бизнес-проблемы:

Клиент делает бизнес с нескольких сотен поставщиков.

Поставщики являются "тип" конкретные. Это означает, что продавец продает компьютерного оборудования (Например. Dell) или офисные принадлежности (Например. Скобы).

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

Бизнес-решение:

Дифференцировать поставщиков в системе через «тип».

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

Техническое решение:

Была разработана форма InfoPath позволяет пользователям вводить онлайн купить заявок.

Два списка выбора InfoPath контролировать выбор подрядчика. Первый, пользователь выбирает «тип покупки». Это ограничивает второй список выбора содержит только тех поставщиков, которые продают для данного типа покупки. Это классический Каскадный раскрывающийся список.

Поставщики, хранятся в пользовательский список Мосс с пользовательские столбцы для поставщиков таких атрибутов, как имя, адрес и особенно «тип».

Реализация веб-службы для клиента InfoPath потреблять, перебор списка пользовательских поставщиков, возвращение только поставщиков, сопоставление предоставленного «тип».

Вызов веб-службы через формы InfoPath.

Уроки:

  • Первый, представляется необходимым идти по этому пути. Я хотела бы сделать фильтрацию целиком в InfoPath и не создает каких-либо веб-службу функциональностью здесь. Однако, сервер форм не обеспечивает необходимые возможности фильтрации. Мы можем поместить правило на "типа" список выбора в форме своего рода возобновлять поставщик запроса, но мы не можем получить его для правильной работы. Поэтому, Это было необходимо для реализации веб-службы.
  • Это классический «каскадного списка выбора" проблема в InfoPath формирует сервер мира и хорошим примеров множество, там, где описано для решения этой проблемы.
  • Пустое значение для столбца в списке поставщиков не возвращает пустую строку при обращении как этот: initItem[«Имя поставщика"]. Вместо этого, Возвращает значение null.

Некоторые другие заметки:

  • Я возвращать массив[] поставщиков, потому что я имел некоторые трудности возвращения ArrayList. InfoPath жалобами об этом и у меня не было времени или желания бороться за его. Это, Конечно, накладывает искусственные ограничения на общее количество поставщиков. Он также вынудила меня осуществить отделкой() метод в массиве, потому что я ненавижу идею возвращения обратно 100 null поставщиков. InfoPath не заботится, но это nagged на меня. (Снова, Это было проще, чем борьба с InfoPath над ArrayLists).
  • Я реализовал GetSpecificVendorByName() функция также, который может быть поучительным.

Код:

использование Система;
использование System.Web;
использование System.Web.Services;
использование System.Web.Services.Protocols;
использование Microsoft.SharePoint;
использование System.Configuration;

/// <Резюме>
///
Поставщик услуг: Предоставляет связанных поставщиков услуг, которые сегодня потребляются клиента формы infopath.
///
/// История:
/// ——–
/// 07/24/07: Первоначальное кодирование, Paul J. Гэвин Conchango.
///
/// </Резюме>
[WebService(Пространство имен = «http://www.Conchango.com/")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
государственные класс VendorService : System.Web.Services.WebService
{

/// <Резюме>
/// Представляет поставщика из списка пользовательских sharepoint поддерживается MSUSA.
/// </Резюме>
государственные класс Поставщик
{
государственные Поставщик() { }

государственные Поставщик(SPItem initItem)
{
Если (! (initItem[«Имя поставщика"] == значение NULL)) Вендор = initItem[«Имя поставщика"].ToString();
Если (! (initItem[«Адрес 1"] == значение NULL)) VendorAddress1 = initItem[«Адрес 1"].ToString();
Если (! (initItem[«Адрес 2"] == значение NULL)) VendorAddress2 = initItem[«Адрес 2"].ToString();
Если (! (initItem[«Город"] == значение NULL)) VendorCity = initItem[«Город"].ToString();
Если (! (initItem["VendorPhone"] == значение NULL)) VendorPhone = initItem["VendorPhone"].ToString();
Если (! (initItem["PurchaseType"] == значение NULL)) VendorType = initItem["PurchaseType"].ToString();
Если (! (initItem[«Государство"] == значение NULL)) VendorState = initItem[«Государство"].ToString();
Если (! (initItem[«Zip"] == значение NULL)) VendorZip = initItem[«Zip"].ToString();
Если (!(initItem["Факс"] == значение NULL)) VendorFax = initItem["Факс"].ToString();
Если (!(initItem["SalesRepName"] == значение NULL)) VendorSalesRepName = initItem["SalesRepName"].ToString();

VendorItemId = initItem.ID; // Уникальный идентификатор, поддерживать через Мосс.
}

государственные int VendorItemId;
государственные Строка Вендор;
государственные Строка VendorAddress1;
государственные Строка VendorAddress2;
государственные Строка VendorCity;
государственные Строка VendorState;
государственные Строка VendorZip;
государственные Строка VendorPhone;
государственные Строка VendorType;
государственные Строка VendorSalesRepName;
государственные Строка VendorFax;
}

государственные VendorService () {

//Раскомментируйте следующую строку при использовании разработаны компоненты
//Метод InitializeComponent();
}

частные Поставщик[] GenerateTestVendors()
{
Поставщик[] resultList;
resultList = Новые функции Поставщик[100];

Поставщик v;
v = Новые функции Поставщик();
v.VendorAddress1 = "v1_address1";
v.VendorAddress2 = "v1_address2";
v.VendorCity = "v1_city";
v.VendorName = "v1_vendorname";
v.VendorPhone = "v1_vendorphone";
v.VendorState = «v1_st";
v.VendorType = "v1_type";
v.VendorZip = "v1_zip";

resultList[0] = v;

v = Новые функции Поставщик();

v.VendorAddress1 = "v2_address1";
v.VendorAddress2 = "v2_address2";
v.VendorCity = "v2_city";
v.VendorName = "v2_vendorname";
v.VendorPhone = "v2_vendorphone";
v.VendorState = "v2_st";
v.VendorType = "v2_type";
v.VendorZip = "v2_zip";

resultList[1] = v;

v = Новые функции Поставщик();
v.VendorAddress1 = "v3_address1";
v.VendorAddress2 = "v3_address2";
v.VendorCity = "v3_city";
v.VendorName = "v3_vendorname";
v.VendorPhone = "v3_vendorphone";
v.VendorState = "v3_st";
v.VendorType = "v3_type";
v.VendorZip = "v3_zip";

resultList[2] = v;

возвращение resultList;

}

[WebMethod]
государственные Поставщик GetSpecificVendorById(int vendorId)
{
Строка SpVendorSiteName; // Имя фактического Мосс сайта, на котором размещается список пользовательских поставщиков.
Строка SpVendorListName; // Имя фактического списка Мосс, содержащий поставщиков.

SpVendorSiteName = ConfigurationSettings.AppSettings["VendorListHostingSite"].ToString();
SpVendorListName = ConfigurationSettings.AppSettings[«VendorList"].ToString();

использование (SPSite сайта = Новые функции SPSite(SpVendorSiteName))
{

использование (SPWeb веб сайт =. OpenWeb())
{

SPList currentList = web. Списки[SpVendorListName];

SPItem specificItem = currentList.Items[vendorId];

возвращение Новые функции Поставщик(specificItem);

} // с помощью веб-spweb = site.openweb()
} // используя сайт spsite = новые spsite(«http://localhost/Мидзухо")

}

[WebMethod]
// Предполагается, что имя поставщика является уникальным, с точки зрения бизнеса
государственные Поставщик GetSpecificVendorByVendorName(Строка Имя_вендора)
{
Строка SpVendorSiteName; // Имя фактического Мосс сайта, на котором размещается список пользовательских поставщиков.
Строка SpVendorListName; // Имя фактического списка Мосс, содержащий поставщиков.

SpVendorSiteName = ConfigurationSettings.AppSettings["VendorListHostingSite"].ToString();
SpVendorListName = ConfigurationSettings.AppSettings[«VendorList"].ToString();

использование (SPSite сайта = Новые функции SPSite(SpVendorSiteName))
{
использование (SPWeb веб сайт =. OpenWeb())
{

SPList currentList = web. Списки[SpVendorListName];

по каждому элементу (SPItem vendorItem в currentList.Items)
{
Если (vendorItem[«Имя поставщика"] == значение NULL) продолжить;

Если (vendorItem[«Имя поставщика"].ToString().Равно(Имя_вендора))
возвращение Новые функции Поставщик(vendorItem);
}

Поставщик v = Новые функции Поставщик();
v.VendorPhone = «не найден: " + Имя_вендора;

возвращение v;

возвращение значение NULL;

} // с помощью веб-spweb = site.openweb()
} // используя сайт spsite = новые spsite(«http://localhost/Мидзухо")

} // метод

[WebMethod]
государственные Поставщик[] GetVendorsOfType (Строка filterType)
{

Строка SpVendorSiteName; // Имя фактического Мосс узла, содержащего t
Он поставщиков настраиваемого списка.
Строка SpVendorListName; // Имя фактического списка Мосс, содержащий поставщиков.

SpVendorSiteName = ConfigurationSettings.AppSettings["VendorListHostingSite"].ToString();
SpVendorListName = ConfigurationSettings.AppSettings[«VendorList"].ToString();

Поставщик[] resultList;
int vendorIndex = 0;
resultList = Новые функции Поставщик[1000];

// Инициализация списка с понятное сообщение по умолчанию.
Поставщик v = Новые функции Поставщик();
v.VendorName = «Выбрать тип поставщика для заполнения списка.";
resultList[0] = v;

// Преобразовать в нижний регистр для удобства сравнения строк позже фильтр.
filterType = filterType.ToLower();

// Если переданный тип фильтра является «тест», создать несколько простых данных.
#регион Тип фильтра = "тест"
Если (filterType Equals.("тест"))
возвращение GenerateTestVendors();
#endregion

Если (Истина)
{
использование (SPSite сайта = Новые функции SPSite(SpVendorSiteName))
{
использование (SPWeb веб сайт =. OpenWeb())
{

v = значение NULL;

SPList currentList = web. Списки[SpVendorListName];

// Перебор всех элементов в списке поставщиков.
по каждому элементу (SPItem vendorItem в currentList.Items)
{

Строка lowerVendorType;

lowerVendorType = vendorItem["PurchaseType"].ToString().Метод ToLower();
lowerVendorType = lowerVendorType.Substring(3);

Если (Равен lowerVendorType.(filterType))
{
resultList[vendorIndex ] = Новые функции Поставщик(vendorItem);
}
} // итерация через все поставщиков в списке


возвращение TrimVendorArray(vendorIndex, resultList);
// возвращение resultList;

} // с помощью веб-spweb = site.openweb()
} // используя сайт spsite = новые spsite(«http://localhost/Мидзухо")

} // Если true

возвращение значение NULL;
}

частные Поставщик[] TrimVendorArray(int newSize, Поставщик[] originalVendorArray)
{
Поставщик[] trimmedArray;

Если (newSize == 0) newSize = 1;
trimmedArray = Новые функции Поставщик[newSize];

int currentCounter = 0;

для (currentCounter = 0; currentCounter < newSize; currentCounter )
{
trimmedArray[currentCounter] = originalVendorArray[currentCounter];
}

возвращение trimmedArray;

}
}

МОСС: Замечания о отладку InfoPath

Сообщения об ошибках InfoPath формы сервера заблуждение.

Во время разработки формы InfoPath, Я бы разместить его на сервере MOSS и получить доступ к форме. Форма будет начало загрузки и затем создавать заблуждение сообщение об ошибке, указывая на меня в журнале событий windows сведения. На самом деле, сообщение не было написано в журнале событий windows. Скорее, сообщение было отправлено в журнале диагностики Мосс ascii. Вы можете отследить что через Центральный Услуги администрации.

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

МОСС: Обновление настраиваемого списка

Есть много хороших примеров обновления пользовательских списков через SDK. Вот еще один.

Бизнес-проблемы: Формы InfoPath был разработан, что позволяет пользователям вводить онлайн купить заявок. PO реквизиции, цифры должны быть традиционной последовательности на основе целочисленные значения и рассчитывается автоматически.

Бизнес-решение: Создание настраиваемого списка Мосс, содержащий два столбца: «ControlField" и «ControlValue». Столбец значение содержит следующий номер заявки на покупку. Обратите внимание, что универсальный «контроль" именования обеспечивает для будущего управления полей, которые могут быть использованы при необходимости.

Техническое решение: Создание веб-службы, доступ клиента InfoPath. Веб-служба возвращает обратно следующий номер заявки покупки и обновляет значение из списка.

Уроки:

  • При добавлении этой веб-службы в качестве источника данных для формы InfoPath, Я счел необходимым преобразовать его в udc и хранить его в библиотеку подключений к данным.
  • Я также счел необходимым для включения междоменного сценария через Центральный Услуги администрации // Управление приложениями // Форма Конфигурация сервера.
  • Впервые форме пытался получить доступ к веб-службе, Это занимает некоторое время и по случаю, Это будет время ожидания. Я fiddled с параметрами конфигурации сервера формы расширить параметры времени ожидания и, казалось, чтобы помочь.

Код:

использование Система;
использование System.Web;
использование System.Web.Services;
использование System.Web.Services.Protocols;
использование Microsoft.SharePoint;
использование System.Configuration;

[WebService(Пространство имен = «http://www.Conchango.com/")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
государственные класс PoService : System.Web.Services.WebService
{
государственные PoService () {

//Раскомментируйте следующую строку при использовании разработаны компоненты
//Метод InitializeComponent();
}

/// <Резюме>
/// Получить следующий номер заказа из списка элементов управления sharepoint po номер.
/// Увеличьте номер PO в этом списке.
/// </Резюме>
/// <Возвращает></Возвращает>
[WebMethod]
государственные Строка GetNextPoNumber()
{
Строка SpPoControlSiteName; // Имя фактического Мосс сайта, на котором размещается список PO управления.
Строка SpPoControlListName; // Имя фактического списка Мосс, содержащий элемент управления Po.

SpPoControlSiteName = ConfigurationSettings.AppSettings[«PoControlListHostingSite"].ToString();
SpPoControlListName = ConfigurationSettings.AppSettings[«PoControlList"].ToString();

Строка nextPoReqNumber = «xyzzy";

использование (SPSite сайта = Новые функции SPSite(SpPoControlSiteName))
{
использование (SPWeb веб сайт =. OpenWeb())
{

SPList currentList = web. Списки[SpPoControlListName];

по каждому элементу (SPItem controlItem в currentList.Items)
{

Если (((Строка)controlItem[«ControlField"]).Равно(«NextPoNumber"))
{
nextPoReqNumber = (Строка)controlItem[«ControlValue"];

int int_nextPoReqNumber;
int_nextPoReqNumber = Конвертировать.ToInt32(nextPoReqNumber);

int_nextPoReqNumber ;

controlItem[«ControlValue"] = int_nextPoReqNumber;
controlItem.Update();
}

} // Поиск, чтение и обновление PO номер в списке.


} // с помощью веб-spweb = site.openweb()
} // используя сайт spsite = новые spsite(«http://localhost/Мидзухо")

возвращение nextPoReqNumber;

}
}